Comparable 与 Comparator 的区别
2016-10-14 17:14
344 查看
为了方便实例的排序,我们常常使用到 Comparable<> 或者
Comparator<> 这两个接口,这两个看似很相似,其实是有很大区别的
这个接口,这个类的实例就具备与同一个类的其它实例的比较能力。我们需要实现 Comparable 接口中的 int compareTo(Object o1) 这个方法;
如果有一个类实现的这个接口,它两个实例为A,B,对它们进行比较 A.comparaTo(B) 它返回有三种可能:
1) positive – 当前对象大于o1;
2) zero – 当前对象等于o1;
3) negative – 当前对象小于o1;
如果我们有一个实现了该接口类的对象集合list,我们就可以使用 Collections.sort(list) 对集合进行排序,如果是数组我们可以使用 Arrays.sort(Object[]) 对数组进行排序; Compareble 相当于一个内部比较器,它是实例所拥有的,实例自己具有与别的实例的比较的能力;
需要实现它的 int compare(Object o1, Objecto2) 方法:返回值
1) positive – o1大于o2
2) zero – o1等于o2
3) negative – o1小于o2
我们需要比较某两个相同类的实例 A B 的时候,需要使用 compare(A,B) ;
当我们有一个对象集合,我们需要对它进行排序,可以使用 java.util.Collections.sort(List,Comparator) 或者
java.util.Arrays.sort(Object[], Comparator)
2) 我们写一个类实现Comparator接口,让People对象能基于年龄比较
3)测试
输出
Comparator<> 这两个接口,这两个看似很相似,其实是有很大区别的
Comparable
这个接口的位置为 java.lang.Comparable ,如果一个类实现的这个接口,这个类的实例就具备与同一个类的其它实例的比较能力。我们需要实现 Comparable 接口中的 int compareTo(Object o1) 这个方法;
如果有一个类实现的这个接口,它两个实例为A,B,对它们进行比较 A.comparaTo(B) 它返回有三种可能:
1) positive – 当前对象大于o1;
2) zero – 当前对象等于o1;
3) negative – 当前对象小于o1;
如果我们有一个实现了该接口类的对象集合list,我们就可以使用 Collections.sort(list) 对集合进行排序,如果是数组我们可以使用 Arrays.sort(Object[]) 对数组进行排序; Compareble 相当于一个内部比较器,它是实例所拥有的,实例自己具有与别的实例的比较的能力;
Comparator
这个接口位置 java.util.Comparator 顾名思义,它是一个比较器,它不被某个实例所拥有,它相当于一个外部定义的比较某种东西的工具;需要实现它的 int compare(Object o1, Objecto2) 方法:返回值
1) positive – o1大于o2
2) zero – o1等于o2
3) negative – o1小于o2
我们需要比较某两个相同类的实例 A B 的时候,需要使用 compare(A,B) ;
当我们有一个对象集合,我们需要对它进行排序,可以使用 java.util.Collections.sort(List,Comparator) 或者
java.util.Arrays.sort(Object[], Comparator)
实例
1)我们定义一个People类,它实现了Comparable接口,所以每一个People的实例有具有与People实例比较的能力;class People implements Comparable<People>{ private String name; private int age; public People(String name,int age) { this.name = name; this.age = age; } public int getAge() { return this.age; } public String getName() { return this.name; } public String toString(){ return this.name + "-" + this.age; } /** * 实现comparaTo方法,我们依据实例的name比较 * 因为name为String对象 * 所以可以调用name 的 comparaTo 方法 * **/ @Override public int compareTo(People p) { return this.name.compareTo(p.name); } /** * 重写equals()方法,因上面我们使用 它们的name比较,所以equals 中, * name相同,我们返回true * **/ public boolean equals(People p) { if(p == this) return true; if(p instanceof People) { if(this.name.equals(p.name)) return true; } return false; } }
2) 我们写一个类实现Comparator接口,让People对象能基于年龄比较
class AgeSortPeople implements Comparator<People>{ @Override public int compare(People o1, People o2) { return o1.getAge() - o2.getAge(); } }
3)测试
public class DD { public static void main(String[] args) { /** * 创建一个People对象list * */ List<People> list = new ArrayList<>(); list.add(new People("AB",40)); list.add(new People("CC",40)); list.add(new People("AA",10)); list.add(new People("AC",30)); list.add(new People("BB",20)); System.out.printf("Original sort, list:%s\n", list); //集合排序的时候使用的是People对象自身的比较器 Comparable 中的 compareTo 方法 Collections.sort(list); System.out.printf("Name sort, list:%s\n", list); //集合排序的时候我们传入了一个我们自定义的外部比较器 Collections.sort(list, new AgeSortPeople()); System.out.printf("Age sort, list:%s\n", list); } }
输出
Original sort, list:[AB-40, CC-40, AA-10, AC-30, BB-20] Name sort, list:[AA-10, AB-40, AC-30, BB-20, CC-40] Age sort, list:[AA-10, BB-20, AC-30, AB-40, CC-40]
相关文章推荐
- Comparable与Comparator的区别
- Comparable与Comparator的区别
- Comparable与Comparator的区别
- java Comparable 和Comparator详解及 区别(附代码)
- java比较器Comparator 和 Comparable 的区别
- Comparator和Comparable和类Collator的区别?(对象排序)
- comparator接口与Comparable接口的区别
- Comparable接口与comparator接口的区别与联系
- Java学习之Comparable与Comparator的区别
- Comparable与Comparator的区别
- 比较器Comparator 和 Comparable的简单区别
- Java中Comparable与Comparator的区别
- Comparable与Comparator的区别
- Comparable和Comparator的区别
- Comparator 和 Comparable 这两个比较接口的区别
- comparator接口与Comparable接口的区别
- Java 解惑:Comparable 和 Comparator 的区别
- Comparable和Comparator接口的区别
- comparator接口与Comparable接口的区别
- comparator接口与Comparable接口的区别