Java 处理二维数组排序的任务

Java 处理二维数组排序的任务,java,arrays,sorting,multidimensional-array,Java,Arrays,Sorting,Multidimensional Array,我被分配了一项任务,要求我使用2D阵列。我必须读入一个文件并将其导出到二维数组。我只能有一个方法,但无法正确排序数组。我应该按照3种方式对数据进行排序(按姓名字母顺序排列,分数从高到低;每个学生的分数从高到低,平均分从高到低) import java.util.*; import java.io.*; public class ScoreSorter { public static void main(String[] args) { int student_num

我被分配了一项任务,要求我使用2D阵列。我必须读入一个文件并将其导出到二维数组。我只能有一个方法,但无法正确排序数组。我应该按照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!!!!!");
        }
    }
}
import java.util.*;
导入java.io.*;
公开课记分员{
公共静态void main(字符串[]args){
int student_num=30;
字符串[][]DataInTableArr=新字符串[30][6];
试一试{
BufferedReader ReadIn=新的BufferedReader(新文件阅读器(“classZ.csv”);
对于(int i=0;i<30;i++){
字符串DataIn=ReadIn.readLine();
字符串[]DataInArr=DataIn.split(“,”);
DataInTableArr[i][0]=DataInArr[0];
DataInTableArr[i][1]=DataInArr[1];
DataInTableArr[i][2]=DataInArr[2];
DataInTableArr[i][3]=DataInArr[3];
int-testest1=Integer.parseInt(DataInArr[1]);
int-testest2=Integer.parseInt(DataInArr[2]);
int-testest3=Integer.parseInt(DataInArr[3]);
}
}捕获(例外e){
System.out.println(“哎呀,你搞砸了,重新启动程序!!!”;
}
}
}

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

一个可行的方法是创建一个实现类似接口的学生类,成员如下:

String name;
int scoreOne;
int scoreTwo;
int scoreThree;
compareTo(Student s) { //implement the comparison following 3 criteria you mentioned }
然后,逐行读取文件,我们为每一行创建一个Student对象,并将所有行放在树集中。这样,树集和比较方法将帮助我们自动对学生进行排序

最后,迭代排序后的树集以填充2D数组

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!!!!!");
    }
}
}
并假设它是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]的所有三个主题中找到最高分数,然后将最高分数与下一行的分数进行比较

根据平均分数排序的逻辑

将每一行的平均值计算为

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

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

我相信@Andreas提出的方法比我的方法更好-我们可以不用树集来完成。因此,请继续基于该方法的工作(如PasetBin代码所示):-)有很多,但bubblesort是性能最差的方法之一。只需使用Java内置的排序当您可以交换行数组(
String[]row=DataInTableArr[i];DataInTableArr[i]=DataInTableArr[i+1];DataInTableArr[i+1]=row;
)时,为什么要交换单个值?哦,对了,我们可以交换完整的行。谢谢你的评论@Andreas。我推荐气泡排序,因为它对初学者来说很容易实现。不,我们不会删除这篇文章。一旦收到回复,您就有删除帖子的历史,这与堆栈溢出的精神完全背道而驰。如果您想请求取消此帐户与您的帖子的关联,请与社区团队联系并提出您的请求:
(Integer.parseInt(DataInTableArr[i][1]) + Integer.parseInt(DataInTableArr[i][2]) + Integer.parseInt(DataInTableArr[i][3]))/3