赞
踩
对二维数组按进行排序,直接调用Arrays.sort就行:
private static int [][] sortRows(int[][] arr) {//行排序
for (int i = 0; i < arr.length; i++) {
Arrays.sort(arr[i]);
}
return arr;
}
按第0列,进行升序排序:
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
值得一提的是,这里面用到的方法的compare的原理是这样的:
//compare
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
对于输入的x,y:
若x<y,则返回-1(小于0的数);
若x=y,则返回0;
若x>y,则返回1(大于0的数);
在源码中,如果调用compare方法返回值大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的 升序了;如果将x,y顺序调换,就是降序了
返回值小于等于0的时候,保持前后顺序不变;
n行2列数组,先按数组的第一列进行升序排序,若某两行第一列相等,则按照第二列进一步排序:
Arrays.sort(arr, new Comparator<int[]>() { // 匿名内部类
@Override
public int compare(int[] o1, int[] o2) {
// 如果第一列元素相等,则比较第二列元素
if (o1[0]==o2[0]) return e1[1]-e2[1]; // o1[1]-o2[1]表示对于第二列元素进行升序排序
return o1[0]-o2[0]; // o1[0]-o2[0]表示对于第一列元素进行升序排序
}
});
另外提一点,当需要比较的元素接近那个元素类型的临界值时,使用相减的形式作为compare的返回值容易出现越界异常,因此建议进行if-else大小比较返回值,而不是相减:
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] > o2[0])
return 1;
else if(o1[0] == o2[0])
return 0;
else
return -1;
}
});
按第一列元素升序排序:
Arrays.sort(arr, (o1, o2) -> (o1[0] - o2[0])); // "->"lambda表达式符号,其将参数与实现隔开
如果有数值溢出风险建议采用下面的方法:
Arrays.sort(arr,(int a[],int b[])->Integer.compare(a[0],b[0]));
这样采用的就是比较而不是作差的方式,可以一定程度上规避数值溢出的风险。
Arrays.sort(arr, Comparator.comparingInt(o -> o[0]));
Comparator.comparingInt方法创建一个比较器对象,Comparator.comparingInt方法是Java 8中Comparator接口的一个静态方法,它可以根据指定的键(即排序关键字)对对象进行排序。在这个例子中,我们通过指定o -> o[0]作为键来按照二维数组的第一列进行排序。
使用Comparator.comparingInt方法的好处是它可以更加简洁地定义比较器,同时也可以方便地添加多个排序关键字。比如,如果我们想要按照二维数组的第一列和第二列进行升序排序,可以使用以下代码:
Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[0]).thenComparingInt(o -> o[1]));
这段代码中,我们首先使用Comparator.comparingInt方法按照第一列进行排序,然后使用thenComparingInt方法按照第二列进行排序。这样就可以按照多个关键字进行排序了。
需要注意的是,使用Comparator.comparingInt方法需要注意排序键的类型。在这个例子中,我们使用了int[]作为排序键的类型,因为我们要按照一维数组的第一个元素进行排序。如果要按照其他类型的字段进行排序,需要相应地修改比较器的实现方式和排序键的类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。