本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Java中自定义比较器 今天写算法题的时候需要用到数组排序,而且是自定义的,这块知识欠缺,就进行了相应的资料查询。
以我自己的理解,Java中自定义比较器有三种
1、数组比较器
数组比较器用到了Arrays的工具类,此类中提供了许多静态方法,其中sort是默认升序,并且我查看了sort的源代码,使用的是快速排序:
快速排序相信大家都不陌生,这里不再多说了。
刚才说到sort默认是升序,如果我们想要降序呢?
Arrays提供了自定义实现排序,就是自己重新实现Comparator(下面要解释)
Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型
@Override
public int compare(int a, int b){ // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型
return a - b; 升序
// return b - a; 降序
// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的
//两个元素的位置,返回值为负数时,不交换。
}
})
但是我看大家的写法用到了lambda表达式(JDK8新特性),更加简洁了
lc406:
public int[][] reconstructQueue(int[][] people) {
//贪心
//两个维度,先按身高排序,再按大的身高的k插入
//按身高排序
Arrays.sort(people,(a,b) ->{
if (a[0] == b[0]) {
return a[1] - b[1]; //升序
}else {
return b[0] - a[0]; //降序
}
});
LinkedList<int[]> queue = new LinkedList<>();
for (int[] p : people) {
queue.add(p[1],p); //根据k插入,也即是下标
}
return queue.toArray(new int[people.length][]);
}
2、集合比较器
在数组中使用Arrays作为工具类,在集合中的工具类为Collections 原理其实都一样。
3、自定义类比较器
上面讲到的都是java自身的数据类型包装类,如果我们自己定义的类需要比较的话,我们有两种方法:
- 实现Comparable接口
- Comparator接口
1、实现Comparable接口必须实现comparaTo(Object obj)方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小
class Goods implements Comparable {
private String name;
private double price;
//按照价格,比较商品的大小
@Override
public int compareTo(Object o) {
if(o instanceof Goods) {
Goods other = (Goods) o;
if (this.price > other.price) {
return 1;
} else if (this.price < other.price) {
return -1;
}
return 0;
}
throw new RuntimeException("输入的数据类型不一致");
}
//构造器、getter、setter、toString()方法略
}
2、 使用Comparator时需要实现compare方法,也即是我们上面Arrays.sort所用到的。
源码中只有一个compare类
@FunctionalInterface :函数式接口,意思是接口中不能再添加其他的类;
Goods[] all = new Goods[4];
all[0] = new Goods("War and Peace", 100);
all[1] = new Goods("Childhood", 80);
all[2] = new Goods("Scarlet and Black", 140);
all[3] = new Goods("Notre Dame de Paris", 120);
Arrays.sort(all, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Goods g1 = (Goods) o1;
Goods g2 = (Goods) o2;
return g1.getName().compareTo(g2.getName());
}
});