Comparable接口(自然排序)
说明:
1.系统的一些自带类,如String、包装类等已经实现了该接口,并重写了compareTo(obj)方法,规定了两个对象的比较大小方式
2.这些类如果进行排序,默认是从小到大
3.重写compareTo(obj)规则:
(1)如果当前对象大于形参对象obj,返回正整数
(2)如果当前对象等于形参对象obj,返回负整数
(3)如果当前对象小于形参对象obj,返回0
使用场景:
对于自定义类的对象我们想要进行排序,则可以让自定义类实现Comparable接口,重写compareTo(obj)方法,指明如何排序。
通俗解释:
Comparable带来比较能力,给类赋予一种比较大小的能力。
实例:
public class Goods implements Comparable{
private String name;
private double price;
//指明商品比较大小的方式:按照价格从低到高排序,若价格相等,再按照产品名称从高到低排序
@Override
public int compareTo(Object o) {
if(o instanceof Goods){
Goods goods = (Goods)o;
//方式一:
if(this.price > goods.price){
return 1;
}else if(this.price < goods.price){
return -1;
}else{
return -this.name.compareTo(goods.name);
}
}
throw new RuntimeException("传入的数据类型不一致!");
}
}
Comparator接口(定制排序)
说明:
1.造一个类,实现Comparator接口,重写compare方法,用这个类的对象充当比较器
2.通常使用匿名类匿名对象直接在排序方法中传入比较器
3.重写compare(Object o1,Object o2)规则:
(1)o1大于o2,返回正整数(不一定是返回1)
(2)o1等于o2,返回0
(3)o1小于o2,返回负整数
使用场景:对已经实现了Comparable接口的类想改变排序方式,只是临时用一下不想改类代码(如默认是升序,想改成降序),可以临时用Comparator实现。
通俗解释:
Comparator是一个比较器,使得对象依照这个比较器来比较
实例:
//匿名类的方式
Comparator com = new Comparator() {
//指明商品比较大小的方式:照产品名称从低到高排序,再照价格从高到低排序
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Goods && o2 instanceof Goods){
Goods g1 = (Goods)o1;
Goods g2 = (Goods)o2;
if(g1.getName().equals(g2.getName())){
return -Double.compare(g1.getPrice(),g2.getPrice());
}else{
return g1.getName().compareTo(g2.getName());
}
}
throw new RuntimeException("输入的数据类型不一致");
}
}
//使用:
Arrays.sort(goods,com);
Collections.sort(goods,com);
new TreeSet(com);
两种方式对比
1、Comparable接口一旦实现,保证类的对象在任何位置都可以按此规则比较大小
2、Comparator属于临时性比较,通常是使用匿名类匿名对象方式直接在排序函数中传参
注意点
实现了Comparable接口的类,其对象之间只能调用compareTo函数比较大小,不能直接使用’>’、’<'等关系运算符比较