java 二维数组二次排序
java 2d array secondary sort
我想对以下二维数组进行排序,使每行的第一个索引按升序排列,如果两行相同,则第二个索引也按升序排列。例子:
给定:
int[][] arr = new int[][]{{2,5},{2,3},{2,1},{2,4},{2,2},{1,2},{1,1},{1,4},{1,3},{1,5}};
我希望它是 arr = {{1,1},{1,2},{1,3},{1,4},{1,5},{2,1},{2,2},{2,3},{2,4},{2,5}};
我使用以下方法按第一个索引排序:
Arrays.sort(arr, Comparator.comparingInt(arr -> arr[0]));
现在我的想法是将它切割成子数组,对它们进行排序,然后将它们合并回一起,但我真的很想知道是否有更好的方法来做到这一点,我不知道。 (甚至可能提前使用比较器,谢谢)
您可以使用 thenComparing
将第二个比较器添加到第一个比较器,这基本上会导致一种行为,即如果第一个比较器 returns 结果相等,则第二个比较器用于打破领带:
int[][] arr2 = new int[][]{{2,5},{2,3},{2,1},{2,4},{2,2},{1,2},{1,1},{1,4},{1,3},{1,5}};
Comparator<int[]> first = Comparator.comparingInt(a -> a[0]);
Comparator<int[]> second = Comparator.comparingInt(a -> a[1]);
Arrays.sort(arr2, first.thenComparing(second));
for(int i = 0; i< arr2.length; i++){
System.out.println(arr2[i][0] + "," + arr2[i][1]);
}
也可以通过使用 thenComparingInt
:
创建一个更简洁的比较器版本
Comparator<int[]> cp = Comparator.<int[]>comparingInt(a -> a[0]).thenComparingInt(a -> a[1]);
我想对以下二维数组进行排序,使每行的第一个索引按升序排列,如果两行相同,则第二个索引也按升序排列。例子: 给定:
int[][] arr = new int[][]{{2,5},{2,3},{2,1},{2,4},{2,2},{1,2},{1,1},{1,4},{1,3},{1,5}};
我希望它是 arr = {{1,1},{1,2},{1,3},{1,4},{1,5},{2,1},{2,2},{2,3},{2,4},{2,5}};
我使用以下方法按第一个索引排序:
Arrays.sort(arr, Comparator.comparingInt(arr -> arr[0]));
现在我的想法是将它切割成子数组,对它们进行排序,然后将它们合并回一起,但我真的很想知道是否有更好的方法来做到这一点,我不知道。 (甚至可能提前使用比较器,谢谢)
您可以使用 thenComparing
将第二个比较器添加到第一个比较器,这基本上会导致一种行为,即如果第一个比较器 returns 结果相等,则第二个比较器用于打破领带:
int[][] arr2 = new int[][]{{2,5},{2,3},{2,1},{2,4},{2,2},{1,2},{1,1},{1,4},{1,3},{1,5}};
Comparator<int[]> first = Comparator.comparingInt(a -> a[0]);
Comparator<int[]> second = Comparator.comparingInt(a -> a[1]);
Arrays.sort(arr2, first.thenComparing(second));
for(int i = 0; i< arr2.length; i++){
System.out.println(arr2[i][0] + "," + arr2[i][1]);
}
也可以通过使用 thenComparingInt
:
Comparator<int[]> cp = Comparator.<int[]>comparingInt(a -> a[0]).thenComparingInt(a -> a[1]);