目录
若一个类实现了Comparable接口,就意味着该类支持排序。即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序
- public interface Comparable
{ - public int compareTo(T o);
- }
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”
- 定义一个可比较的类 --- 是为了排序 ---排序规则
- public class Pig implements Comparable
{ - private Long id;
- private double weight;
- public int compareTo(Pig obj){
- double res=this.weight-obj.weight;
- if(res>1e-6) return 1;
- else if(res<-1e-6) return -1;
- return 0;
- }
- }
-
-
- List
list=new ArrayList<>(); - Random r=new Random();
- for(int i=0;i<10;i++){
- Pig temp=new Pig(1L+i, r.nextDouble()*500);
- list.add(temp);
- }
- Collections.sort(lit);
- for(int i=0;i
Collections是集合中所使用的一个工具类,其中提供了一些常见的集合操作方法,例如排序
Comparator是比较器接口
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么可以
建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说
可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
如果Pig类并没有实现Comparable接口,调用Collections.sort(list);则代码报错
- 这是因为在Collections工具类中方法的定义为
- public static
extends Comparable super T>> void sort(List list) { - list.sort(null);
- }
T extends Comparable不是说T必须继承于Comparable接口,而是表示T类型必须实现了
Comparable接口。这里报错就是因为Pig类定义和Comparable接口无关
按照开闭原则不修改源代码,则可以额外引入比较器
- public static
void sort(List list, Comparator super T> c) { - list.sort(c);
- }
Comparator比较接口的定义
- @FunctionalInterface 函数式接口,所以可以使用lambda表达式
- public interface Comparator
{ - int compare(T o1, T o2);
-
- boolean equals(Object obj);
-
- default Comparator
reversed() { - return Collections.reverseOrder(this);
- }
- }
这里将compare和equals声明在一起,是提醒开发者注意两者之间的相关性
- List
list=new ArrayList<>(); - Random r=new Random();
- for(int i=0;i<10;i++){
- Pig temp=new Pig(1L+i, 500*r.nextDouble());
- list.add(temp);
- }
- //使用lambda表达式定义
- Comparator
c=(obj1,obj2)->{ 泛型声明影响obj1和obj2为Pig类型 - double res=obj1.getWeight()-obj2.getWeight(); //直接调用Pig类中的方法
- if(res>1e-6) return 1;
- else if(res<-1e-6) return -1;
- else return 0;
- };
- Collections.sort(list, c.reversed());
- list.forEach(System.out::println);
注意:在不同Eclipse版本中编写Lambda表达式可能会有报错,但是不一定是程序问题
Comparator和Comparable比较
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”