按每个列的多个规则对二维数组进行排序

时间:2017-04-27 15:12:17

标签: 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 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是我的二维数组..我的问题是,我如何按多个规则排序?并且规则的数量不是用户提供的规则。

3 个答案:

答案 0 :(得分:1)

  

如何按多个规则排序?并且当用户提供规则时,规则的数量不是恒定的

为每列提供Comparator

然后,您可以使用Group Comparator将2个或更多Comparators合并为一个Comparator,这样您就可以随意混合搭配。

答案 1 :(得分:1)

您的Comparator<String[]>与<{1}}一致。

您可以使用Comparator撰写.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));

实际上,您可以通过以下方式更紧凑地执行此操作:

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

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

答案 2 :(得分:0)

我认为如果你考虑一个对象列表而不是一个二维数组会对你更容易。

然后你可以制作你的对象Comparable

public class Person implements Comparable {
    private Integer id;
    private String name;
    private String gpa;
    ...

    @Override
    public int compareTo(Person p) {
        // TODO Define how to compare two person
    }
}