- Comparable和Comparator都是接口,都可以用来实现集合中元素的比较和排序。
- Comparable接口位于java.lang包下,Comparator接口位于java.util包下
- Comparable接口可以认为是一个内部排序器,将比较代码嵌入自身类中,重写compareTo()方法。
class MyComparable implements Comparable<MyComparable> {
private String name;
private int age;
private boolean sex;
public MyComparable() {
}
public MyComparable(String name, int age, boolean sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
/**
* 重写compareTo方法,实现年龄升序,年龄相同则姓名升序
**/
@Override
public int compareTo(MyComparable comparable) {
if (this.age == comparable.age){
return this.name.compareTo(comparable.name);
}
return this.age - comparable.age;
// 比较者大于被比较者,返回正整数
// 比较者等于被比较者,那么返回0
// 比较者小于被比较者,那么返回负整数
}
}
// 使用
Collections.sort(list);
- Comparator是一个外部比较器,有两种方式使用
4.1 在类内部实现Comparator接口,重写compare()方法
4.2 在外部使用Comparator比较
// 方式1 在类内部实现Comparator接口,重写compare()方法
class MyComparator implements Comparator<MyComparator> {
private String name;
private int age;
private boolean sex;
public MyComparator() {
}
public MyComparator(String name, int age, boolean sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
/**
* 按年龄排序
* @param o1
* @param o2
* @return
*/
@Override
public int compare(MyComparator o1, MyComparator o2) {
return o1.age - o2.age;
}
// o1大于o2,返回正整数
// o1等于o2,返回0
// o1小于o3,返回负整数
}
// 使用
Collections.sort(list);
// 方式2 在外部使用Comparator比较
//按名字升序排序
Collections.sort(list, new Comparator<MyComparator>() {
@Override
public int compare(MyComparator o1, MyComparator o2) {
return o1.getName().compareTo(o2.getName()); //按照名字升序
}
});
//Comparator接口是一个函数式接口,根据jdk1.8新特性,我们采用Lambda表达式简化代码
Collections.sort(list,(u1,u2)->{
return u1.getName().compareTo(u2.getName());
});
网友评论