Java 按每个列的多个条件对二维数组进行排序

Java 按每个列的多个条件对二维数组进行排序,java,arrays,sorting,Java,Arrays,Sorting,我有一个二维数组,我想根据不同列上的n个标准对它进行排序。这是一个例子: ID Name GPA 1 John 3.4 2 John 3.7 3 Aaron 3.0 假设我想先按名称排序,然后按GPA排序,它应该显示: ID Name GPA 3 Aaron 3.0 2 John 3.7 1 John 3.4 到目前为止,我只使用以下代码按一条规则进行排序: Arrays.sort(a, new Comparato

我有一个二维数组,我想根据不同列上的n个标准对它进行排序。这是一个例子:

ID   Name   GPA   
1    John   3.4
2    John   3.7
3    Aaron  3.0
假设我想先按名称排序,然后按GPA排序,它应该显示:

ID   Name   GPA
3    Aaron  3.0
2    John   3.7
1    John   3.4
到目前为止,我只使用以下代码按一条规则进行排序:

Arrays.sort(a, new Comparator<String[]>() {

            @Override
            public int compare(String[] entry1, String[] entry2) {
                String time1 = entry1[n]; \\ n is provided column number
                String time2 = entry2[n]; 
                try {
                    double d1 = Double.parseDouble(time1);
                    double d2 = Double.parseDouble(time2);
                    return (int) (d1 - d2);
                }
                catch (Exception e) {
                    return time1.compareTo(time2);
                }

            }
        });

其中a是我的二维数组。。我的问题是,我如何能按多个规则进行排序?规则的数量不会像用户提供的那样恒定。

< P>我认为如果你考虑一个对象列表而不是二维数组,对你来说会比较容易。 然后你可以制作你的对象

如何按多条规则进行排序?而且规则的数量并不像用户提供的那样是恒定的

为每列提供一个比较器


然后,您可以使用将两个或多个比较器组合到一个比较器中,以便可以根据需要进行混合和匹配。

您使用比较器是正确的

您可以使用.thenComparing组合比较器,以便执行以下操作:

Comparator<String[]> byName = Comparator.comparing( row -> row[1] );
Comparator<String[]> byGPA = Comparator.comparing( row -> Double.parseDouble(row[2]) );

Arrays.sort(a, byName.thenComparing(byGPA));

使用用户输入时,这样的合成是理想的-在运行时根据用户输入的内容进行合成。

谢谢您的回答,我首先想到了这一点,但忘了提到每个表的列可能不同。。假设表1有id、name和gpa,但表2可能有id、name、age和gender,我想创建一个方法来获取数据,生成数组,然后打印它,然后再次循环以创建/排序下一个。表示行的类可能更好-然后可以使用Comparator。comparingRow::getName而不是Comparator。例如,比较行->行[1]。我想创建一个获取数据的方法:这是什么数据?
Comparator<String[]> byName = Comparator.comparing( row -> row[1] );
Comparator<String[]> byGPA = Comparator.comparing( row -> Double.parseDouble(row[2]) );

Arrays.sort(a, byName.thenComparing(byGPA));
Arrays.sort(a, Comparator.comparing( row -> row[1] )
                         .thenComparing( row -> Double.parseDouble(row[2])));