一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
Comparable是什么
简介:实现该接口的类可以进行自比较
自比较:自己对象本身和参数进行比较
一个接口,实现了这个接口的类对象可以根据接口的方法compareTo进行比较来获取比较结果。同时这些对象可以被增加到Collaction集合中,使用Collections.sort(xxx)进行排序
/**
* 实现一个业务逻辑
* 多张优惠券。
* 1,金额大的在前面
* 2,金额相同时,距离有效期最近的在前面
* 3,前两个结果相同时,id小的在前面
*/
public class ComparableDemo {
public static void main(String[] args) {
List<Coupon> coupons = new ArrayList<>();
//添加了一堆coupon。然后调用下面方法就可以对coupon进行排序。这个方法参数必须是实现了Comparable接口并按照业务实现了compareTo方法
Collections.sort(coupons);
}
}
@Data
class Coupon implements Comparable<Coupon> {
private String id;
private Date endTime;
private int price;
@Override
public int compareTo(Coupon o) {
if (o.getPrice() > this.price) {
return 1;
} else if (o.getPrice() == this.price) {
if (this.endTime.compareTo(o.getEndTime()) == 0) {
return id.compareTo(o.getId());
} else {
return this.endTime.compareTo(o.getEndTime());
}
} else {
return -1;
}
}
}
Comparator是什么
简介:可以辅助比较没有实现/想重写对方实现方法Comparable接口的对象进行比较
作用场景一般是
- 预比较的对象没有实现Comparable接口或者实现的compareTo逻辑不是自己想要的,而且无法使用继承来实现(final)
比如我觉得String的自比较方式我不喜欢,那么就可以
class Express implements Comparator<String> {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
//表示不使用String自带的compareTo方法而是使用Express对象中的比较方法
Collections.sort(strings, new Express());
}
@Override
public int compare(String o1, String o2) {
//xxxx各种逻辑实现
return 0;
}
}
两者的区别
Comparable侧重于自比较。也就是对象本身和一个对象的比较。compareTo方法参数是一个对象。
业务场景:将优惠券排序。
Comparator侧重于外比较,就像是帮助别人进行比较一样
业务场景:对名称排序(有时候想按照首字母的拼音排序,有时候想按首字母的笔画排序。)这个时候就可以创建多个类实现Comparator接口。
共同点:都可以使用Collections.sort()方法来对集合对象进行排序。以及好用的特点。
扩展TreeMap
相较于HashMap,TreeMap的主要特点在于可以比较元素的大小。在进行put的时候进行排序。其原理就是在创建Map的时候传入了一个比较器。在put方法的时候会调用这个比较器进行比较
Map<String, String> map2 = new TreeMap<String, String>(
new Comparator<String>() {
public int compare(String obj1, String obj2) {
//升序排序(反过来就是降序排序)
return obj1.compareTo(obj2);
}
});
其中实现的逻辑可以用来进行比较;下面进行put的时候就会自动按照比较结果进行排序。
真不错呀,每天一个小妙招