使用场景
定制排序:java.util.Comparator
- 这个定制排序最常用的地方就是
Arrays.sort(T[] a, Comparator<? super T> c)
或者Collections.sort(List<T> list, Comparator<? super T> c)
这两个地方了 - 重写
Comparator
接口中的compare(Object o1,Object o2)
方法,比较o1和o2的大小,将数组或者集合中的元素按照指定的策略进行排序输出 - 我们可以将
Comparator
接口的实现类传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。当然因为这个接口是被@FunctionalInterface
修饰的,所以我们在传递这个类型的参数时可以使用lambda的方式进行传参
使用举例 例如:
static class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o1.intValue() - o2.intValue();
}
}
public static void main(String[] args) {
Integer[] nums = {1,5,3,6};
// 使用实现类的方式传递比较器
Arrays.sort(nums,new MyComparator());
// 使用匿名内部类的方式传递比较器
Arrays.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.intValue() - o2.intValue();
}
});
// 使用lambda的方式传递比较器
Arrays.sort(nums, (o1, o2) -> {
return o1.intValue() - o2.intValue();
});
}
底层实现的一个原理就是通过不断的调用我们自定义的排序方法,然后完成数组或集合的一个排序
详细解释
详细解释一下Comparator
接口中的compare(Object o1,Object o2)
方法:
结论:
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,说明“o1<o2”,不会改变o1,o2的顺序;返回“零”,意味着“o1等于o2”,也不会改变o1和o2的顺序;返回“正数”,说明“o1>o2”会按照逆序返回
原则:
如果返回的值是一个正数,那么会按照o2、o1的顺序输出;
如果返回的是一个负数,那么会按照o1、o2的顺序输出
分析:
- 如果我们返回o1-o2,那么他会按照升序排序,为什么这么说呢?
我们来看o1-o2,如果结果为正数,那么说明o1大于o2,又因为输出的结果是正数会按照逆序的o2,o1输出,这不正是按照升序的方式进行排序的吗
如果o1-o2的结果为负数,说明o1小于o2,又因为输出的结果是负数不会改变输出的顺序,所以也是升序输出 - 如果我们返回o2-o1,那么它会按照降序排序,为什么这么说呢?
还是上面的结论,如果o2-o1的结果为正数,说明o2大于o1,又因为输出的结果大于0,所以输出的顺序就是o2,o1,而o2大于大于o1,这不正是降序输出吗
如果o2-o1小于等于o,说明o2小于等于o1,那么按照结论不会改变返回的顺序,那不正好是o1,o2的这个降序顺序吗