1、Comparable和Comparator介绍
在java中Intege,Double等基本数据类型和Sting都实现了Comparable接口,不用我们在自己去实现。对于类的比较,需要我们定义比较用到的字段比较逻辑。Comparable是内部比较器需要在类内部实现,Comparator是外部比较器生成比较器对象。
2、使用
(1)类实现Comparable接口重写comparato方法和传的参数进行对比
public class Persion implements Comparable<Persion> {
private int age;
private String name;
public Persion(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(@NonNull Persion o) {
if (this.age - o.age == 0)
return 0;
else
return (o.age - this.age) > 0 ? 1 : -1;
}
@Override
public String toString() {
return "Persion{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
(2)创建一个比较器对象实现Comparator接口重写compara方法,对外部传入的两个类进行比较。
class PersionComparator implements Comparator<Persion> {
@Override
public int compare(Persion o1, Persion o2) {
if (o1.age == o2.age) {
return 0;
} else {
return (o1.age - o2.age) > 0 ? 1 : -1;
}
}
}
两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。
3、比较
List<Persion> list = new ArrayList<>();
Persion p1 = new Persion(10, "小王");
Persion p2 = new Persion(12, "小李");
Persion p3 = new Persion(6, "小张");
list.add(p1);
list.add(p2);
list.add(p3);
Logger.e("Initiallist:" + list);
Collections.sort(list);
Logger.e("Comparablelist:" + list);
Collections.sort(list, new PersionComparator());
Logger.e("Comparatorlist:" + list);
输出Initiallist:[Persion{age=10, name=‘小王’}, Persion{age=12, name=‘小李’}, Persion{age=6, name=‘小张’}]
Comparablelist:[Persion{age=12, name=‘小李’}, Persion{age=10, name=‘小王’}, Persion{age=6, name=‘小张’}]
Comparatorlist:[Persion{age=6, name=‘小张’}, Persion{age=10, name=‘小王’}, Persion{age=12, name=‘小李’}]