我有一个二维数组,我想根据不同列上的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是我的二维数组..我的问题是,我如何按多个规则排序?并且规则的数量不是用户提供的规则。
答案 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
}
}