【问题标题】:Task dealing with sorting 2d array处理二维数组排序的任务
【发布时间】:2015-11-14 15:50:01
【问题描述】:

我被分配了一项需要我使用 2D 阵列的任务。我必须读入一个文件并将其导出到二维数组。我只能有一个方法,但我无法正确排序数组。我应该以 3 种方式对数据进行排序(按姓名字母顺序排列,分数从高到低;每个学生的最高到最低分数,按 3 个分数的平均值从最高到最低。)到目前为止,我有

import java.util.*;
import java.io.*;

public class ScoreSorter {
    public static void main(String[] args) {

        int student_num = 30;
        String[][] DataInTableArr = new String[30][6];
        try {
            BufferedReader ReadIn = new BufferedReader(new FileReader("classZ.csv"));
            for (int i = 0; i < 30; i++) {
                String DataIn = ReadIn.readLine();
                String[] DataInArr = DataIn.split(",");
                DataInTableArr[i][0] = DataInArr[0];
                DataInTableArr[i][1] = DataInArr[1];
                DataInTableArr[i][2] = DataInArr[2];
                DataInTableArr[i][3] = DataInArr[3];
                int temptest1 = Integer.parseInt(DataInArr[1]);
                int temptest2 = Integer.parseInt(DataInArr[2]);
                int temptest3 = Integer.parseInt(DataInArr[3]);
            }
        } catch (Exception e) {
            System.out.println("Whoops, you messed up, RESTART THE PROGRAM!!!!!");
        }
    }
}

我不知道如何解决剩下的任务...如果有人能告诉我最有效的方法,或许还有一个例子,我将不胜感激...

【问题讨论】:

  • 不,我们不会删除这篇文章。一旦收到回复,您就有删除帖子的历史,这与 Stack Overflow 的精神完全背道而驰。如果您想请求解除此帐户与您的帖子的关联,请联系社区团队提出您的请求:stackoverflow.com/contact

标签: java arrays sorting multidimensional-array


【解决方案1】:

一种可行的方法是创建一个实现 Comparable 接口的 Student 类,该类具有以下成员:

String name;
int scoreOne;
int scoreTwo;
int scoreThree;
compareTo(Student s) { //implement the comparison following 3 criteria you mentioned }

并且,逐行读取文件,为每一行创建一个 Student 对象,并将所有行放入 TreeSet 中。这样一来,TreeSet 和 compareTo 方法将帮助我们自动对学生进行排序。

最后,迭代排序后的 TreeSet 以填充二维数组。

【讨论】:

  • 我相信@Andreas 提出的方法比我的要好——我们可以不使用 TreeSet 来实现。因此,请根据该方法继续您的工作(如您的 PasetBin 代码所示):-)
【解决方案2】:
import java.util.*;
import java.io.*;

public class ScoreSorter {
public static void main(String[] args) {

    int student_num = 30;
    String[][] DataInTableArr = new String[30][6];
    try {
        BufferedReader ReadIn = new BufferedReader(new FileReader("classZ.csv"));
        for (int i = 0; i < 30; i++) {
            String DataIn = ReadIn.readLine();
            String[] DataInArr = DataIn.split(",");
            DataInTableArr[i][0] = DataInArr[0];
            DataInTableArr[i][1] = DataInArr[1];
            DataInTableArr[i][2] = DataInArr[2];
            DataInTableArr[i][3] = DataInArr[3];
            int temptest1 = Integer.parseInt(DataInArr[1]);
            int temptest2 = Integer.parseInt(DataInArr[2]);
            int temptest3 = Integer.parseInt(DataInArr[3]);
        }
  /*Code To be Inserted Here*/
    } catch (Exception e) {
        System.out.println("Whoops, you messed up, RESTART THE PROGRAM!!!!!");
    }
}
}

如果有 6 列,其中 First 是名称,其他 3 列是分数,那么其他 2 列包含什么?我忽略了你的数组声明:

String[][] DataInTableArr = new String[30][6];

并假设它是 30x4 数组

String[][] DataInTableArr = new String[30][4];

按字母顺序排序的逻辑

if(DataInTableArr[i][0].compareTo(DataInTableArr[i+1][0])){
     /* Sorting Name of adjacent rows*/
     String temp = DataInTableArr[i][0];
     DataInTableArr[i][0] = DataInTableArr[i+1][0];
     DataInTableArr[i+1][0] = temp;

     /*Sorting the three marks similarly*/

     temp = DataInTableArr[i][1];
     DataInTableArr[i][1] = DataInTableArr[i+1][1];
     DataInTableArr[i+1][1] = temp;

     temp = DataInTableArr[i][2];
     DataInTableArr[i][2] = DataInTableArr[i+1][2];
     DataInTableArr[i+1][2] = temp;

     temp = DataInTableArr[i][3];
     DataInTableArr[i][3] = DataInTableArr[i+1][3];
     DataInTableArr[i+1][3] = temp;

}

将上述代码放入冒泡排序算法中,即2个循环。

按照最高分排序的逻辑

在这种情况下,您必须在每个 DataInTableArr[i] 的所有三个主题中找到最高分,然后将最高分与下一行的最高分进行比较。

按平均分排序的逻辑

计算每个第i行的平均值为

(Integer.parseInt(DataInTableArr[i][1]) + Integer.parseInt(DataInTableArr[i][2]) + Integer.parseInt(DataInTableArr[i][3]))/3

并将其与第 [i+1] 行的平均值进行比较。(相同的公式只需将 [i] 替换为 [i+1])

【讨论】:

  • sorting algorithms 有很多,但从性能方面来说,冒泡排序是最差的之一。只需使用 Java 内置的排序。 --- 当你可以交换行数组时为什么要交换单个值 (String[] row = DataInTableArr[i]; DataInTableArr[i] = DataInTableArr[i+1]; DataInTableArr[i+1] = row;)?
  • 哦,对了,我们可以交换整行。感谢@Andreas 的评论。我推荐冒泡排序,因为初学者很容易实现它。
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多