Java 二维数组按指定列排序(二)
上一篇文章【Java 二维数组按指定列排序(一)】,我们介绍了二维数组按列排序的方法。本章我们对上次的方法进行修改,使其能够支持不同的排序方式(升序 or 降序)。
效果图:
代码实现:
public static void main(String[] args) {
int[][] nums = initialArray(5, 3);
System.out.println("排序前:");
printArr(nums);
// 升序
System.out.println("排序后(升序):");
// 先根据第1列比较,若相同则再比较第0列, 升序排序
sortByColumn(nums, new int[] {1, 0}, true);
printArr(nums);
// 降序
System.out.println("排序后(降序):");
// 先根据第1列比较,若相同则再比较第0列, 降序排序
sortByColumn(nums, new int[] {1, 0}, false);
printArr(nums);
}
/**
* 打印二维数组
* @param nums 数组
*/
private static void printArr(int[][] nums) {
for (int i = 0; i < nums.length; i++) {
System.out.println(Arrays.toString(nums[i]));
}
}
/**
* 构造一个row * col的二维数组
* @param row 二维数组的行数
* @param col 二维数组的列数
* @return 构造的二维数组
*/
private static int[][] initialArray(int row, int col) {
int[][] arr = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// 0-100的随机数
arr[i][j] = (int) (Math.random() * 100);
}
}
return arr;
}
/**
* 按列排序
* @param ob 待排序的数组
* @param order 列排序的优先级, 如:new int{1, 2} 先根据第一列比较,若相同则再比较第二列
* @param ascend 排序方式: (true)升序 / (false)降序
*/
public static void sortByColumn(int[][] ob, final int[] order, boolean ascend) {
Arrays.sort(ob, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
int[] one = (int[]) o1;
int[] two = (int[]) o2;
for (int i = 0; i < order.length; i++) {
int k = order[i];
if (ascend) {
if (one[k] > two[k]) {
return 1;
} else if (one[k] < two[k]) {
return -1;
} else {
continue; // 如果按一条件比较结果相等,就使用第二个条件进行比较。
}
} else {
if (one[k] > two[k]) {
return -1;
} else if (one[k] < two[k]) {
return 1;
} else {
continue; // 如果按一条件比较结果相等,就使用第二个条件进行比较。
}
}
}
return 0;
}
});
}