您的位置:首页 > 其它

Comparable 与 Comparator 的区别

2016-10-14 17:14 344 查看
为了方便实例的排序,我们常常使用到 Comparable<> 或者

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