comparable
comparable是一个结接口,如果某一个类实现类此接口,就代表该类支持排序。
必须使用compareTo方法。
public class Student implements Comparable {
String name;
public int compareTo(Student another) {
return name.compareTo(another.name);
}
// 比较两个对象
student1.compareTo(student2);
// 排序数组或集合
Arrays.sort(students);
Collections.sort(collection);
}
Comparator
若某一个类并没有comparable接口,但想进行排序。可以通过new 一个comparator 来完成。(通过自己新生成的comparator类。常常使用lamda表达式完成。
通过compare方法。
这样是按照成绩降序排列:
public int compare(Student a, Student b) {
return b.getScore() - a.getScore();
// int nameDiff = a.getFirstName().compareTo(b.getFirstName());
// return nameDiff;
}
这样是按照成绩升序排列:
public int compare(Student a, Student b) {
return a.getScore() - b.getScore();
// int nameDiff = a.getFirstName().compareTo(b.getFirstName());
// return nameDiff;
}
如果使用lamda表达式,可以省去(new coparator),这样是升序排列:
Arrays.sort(studentArr,(a,b) -> a.score - b.score);
如果使用priorityQueue 的时候, 这是最小堆(最小的再最上边)
PriorityQueue<Interval> pq = new PriorityQueue<>((Interval a,Interval b)-> a.end - b.end);
区别
comparable
- 内部比较器 Comparable 是排序接口,只包含一个函数 compareTo();若一个类实现了 Comparable 接口,就意味着 “该类支持排序”,它可以直接通过 Arrays.sort() 或 Collections.sort() 进行排序。
- 如果比较的方法只要用在一个类中,用该类实现 Comparable 接口就可以。
comparator
- 外部比较器 Comparator 是比较器接口,单独实现第一个比较器,不需要对原来的类进行结构上的变化,属于无侵入式的;一个类实现了 Comparator 接口,那么它就是一个 “比较器”。其它的类,可以根据该比较器去排序。
- 如果比较的方法在很多类中需要用到,就自己写个类实现 Comparator 接口,这样当要比较的时候把实现了Comparator 接口的类传过去就可以,省得重复造轮子。这也是为什么 Comparator 会在 java.util 包下的原因。
使用 Comparator 的优点:
- 与实体类分离
- 方便应对多变的排序规则,可以同时使用多种排序标准
部分引用自:
作者:杰哥长得帅
链接:https://www.jianshu.com/p/323d120c6dae
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。