使用Comparator比较器

数组的排序方式有很多。

排序,必须选择一个排序标准,可以按照元素的值(整型数组),或者元素的某个属性值(元素为对象时)。

Arrays工具类,位于java.util包,提供了sort方法。支持自定义比较器,实现升序、降序排列等。

多维数组,可以看作元素是数组的集合。同样的思想,按照元素的某一个属性,比如元素的某一列值(二维数组)排序。

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorOrder {

public static void main(String[] args) {
Integer[] nums = new Integer[]{2, 1, 3, 4, 6, 2};
Arrays.sort(nums, (o1, o2) -> o2-o1);
//降序,输出:[6,4,3,2,2,1]
System.out.println(Arrays.toString(nums));

int[][] nums2=new int[][]{{7,0},{4,1},{5,2},{6,3},{8,6}};
// Arrays.sort(nums2, new Comparator<int[]>() {
// @Override
// public int compare(int[] o1, int[] o2) {
// return o1[1]-o2[1];
// }
// });
Arrays.sort(nums2,((o1, o2) -> o1[1]-o2[1]));

//二维数组,按第二列升序
//输出:
//[7,0]
//[4,1]
//[5,2]
//[6,3]
//[8,6]
for (int[] n:nums2){
System.out.println(Arrays.toString(n));
}
}

}

写这个是因为,对compare方法的参数顺序有点懵。所以写下来,理一理。

o1与o2只是参数名称。

(o1,o2)-> o1-o2 ,这种形式,代表升序。

o1代表当前元素,o2是前一个元素。返回o1-o2,默认为正值,表示o1大于o2,即当前元素大于前一个元素。是对数组进行升序排列。

测试过程中,发现对int[ ] 类型的一维数组,不能使用传入自定义的比较器来进行降序排列。

int[] nums = new int[]{2, 1, 3, 4, 6, 2};
Arrays.sort(nums, (o1, o2) -> o2-o1);

上述的写法会报错(可检查)。操作符-不能被应用到T,即说明自定义比较器中两个用于比较的元素必须是对象,或者说是引用类型。

改为如下写法,则编译运行正常。

Integer[] nums = new Integer[]{2, 1, 3, 4, 6, 2};

Arrays.sort(nums, new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});