如何在java中使用Comparator对二维数组进行排序



我需要通过降序排列第一列的元素来对这样的数组进行排序。在第一列元素相等的情况下,第二列的元素必须按升序排序。但我还需要的是检查并将空行放在矩阵的末尾,将只有一个元素的行放在有更多元素的行之前。例如,在这个数组中,{3}-是第一行,{}-是最后一行。

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2}, {3, 3, 5}};
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0])
return o1[1] - o2[1];
return o2[0] - o1[0];
}
});
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}

以下Comparator<int[]>启用排序方式:

  1. 空数组作为最后一个

  2. 升序中相同索引处的较大数字

  3. 如果从索引0开始,较小的数组先变大(就长度而言(,则与后一个数组相比,哪个数组先变小。

这里有一个算法可以根据您的需要轻松修改:

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2, 2}, {3, 3, 5}, {3, 2}};
Arrays.sort(arr, (o1, o2) -> {
if (o1.length == 0) { return 1; }         // empty last
if (o2.length == 0) { return -1; }        // empty last
int min = Math.min(o1.length, o2.length); // upper bound to avoid ArrayIndexOutOfBoundsException
for (int i = 0; i < min ; i++) {
if (o1[i] != o2[i]) {                 // compare values on indices
return o1[i] - o2[i];             // return if different
} 
}
return 1;                                 // it goes first so it lefts first
}
);
System.out.println(Arrays.deepToString(arr)); 

输出为:

[[1,2,3],[1,4],[3],[3,2,2],[3,2],[3]、[3,3,5],]]

最新更新