我有一个二维数组,它持有5张牌的值。 5个阵列中每个阵列的第一个元素代表卡片的套装,第二个元素代表卡片值。
我希望通过第二个元素对第二个数组进行排序,然后按第一个元素排序,同时保持第二个元素的排序顺序(如果这有意义)。例如,排序列表中的所有套装将比所有两套套装更低。例如,{{0,1},{2,1},{0,2}}应该变为{{0,1},{2,1},{0,2}}。
这就是我所拥有的:
// {{3,2}, {2,2}, {0,1}, {1,0}, {2,3}} should become
// {{1,0}, {0,1}, {2,2}, {3,2}, {2,3}}
int[][] hand = {{3,2},{2,2},{0,1},{1,0},{2,3}};
sort(hand);
public static void sort(int[][] hand){
Arrays.sort(hand, new Comparator<int[]>(){
public int compare(int[] o1, int[] o2){
return Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1]));
}
});
}
这是输出{{1,0},{0,1},{3,2},{2,2},{2,3}}。有没有人有什么建议?
答案 0 :(得分:1)
解决方案1:按第二个元素对数组进行排序,然后按第一个元素对数组进行排序。由于Arrays.sort
是稳定的,这相当于第一个元素的第一个比较,然后是第二个元素。
解决方案2:按如下方式修改比较器:
Arrays.sort(hand, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return Integer.compare(o1[1], o2[1]);
} else {
return Integer.compare(o1[0], o2[0]);
}
}
});
或者,与番石榴(披露:我为番石榴做贡献),你可以把比较器写成
public int compare(int[] o1, int[] o2) {
return ComparisonChain.start()
.compare(o1[0], o2[0])
.compare(o1[1], o2[1])
.result();
}
答案 1 :(得分:0)
这对你有用吗?
int compare1 = Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1]);
if(compare1 != 0)
return compare1;
else
return Integer.valueOf(o1[0]).compareTo(Integer.valueOf(o2[0]));
答案 2 :(得分:0)
我将添加Java 8解决方案,以防万一有人想知道。
Arrays.sort(hand, (o1, o2) -> o1[1] == o2[1] ? Integer.compare(o1[0], o2[0])
: Integer.compare(o1[1], o2[1]));
基本上,当第二个元素相等时,它会比较每个数组的第一个元素,否则直接比较第二个元素。
答案 3 :(得分:0)
您可以像这样更紧凑地使用Java 8 Comparator
Arrays.sort(hand, Comparator.comparing(x -> ((int[])x)[1]).thenComparing(x -> ((int[])x)[0]));