Fork me on GitHub

Comparable 和 Comparator比较

对集合或数组进行排序有两种方法:
1.集合中的对象所属的类实现了java.lang.Comparable 接口,然后调用Collections.sort()或者Arrays.sort()
2.实现java.lang.Comparator接口,把这个实现接口的类作为参数传递给上述的sort()方法。

1、Comparable java.lang Interface Comparable
属于Java集合框架下的一个接口。它只有一个方法 int compareTo(T o) 用于提供排序所需要的比较逻辑。实现这个接口的类,其对象都可以通过调用Collections.sort()或者Arrays.sort()进行排序,根据compareTo的逻辑升序排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person implements Comparable<Person>{
String name;
public Person(String name) {
this.name = name;
}
public int compareTo(Person other) {
//按名字的字母顺序从z~a排
if(name.compareTo(other.name) < 0) //当前的字符串,在比较字符串之前,那就返回1
return 1;
else
if(name.compareTo(other.name) > 0)
return -1;
else
return 0;
}
}

2、再来看Comparator java.util Interface Comparator
简单来说,Comparator是策略模式的一种实现,体现了将类和排序算法相分离的原则。

1
2
3
4
5
6
7
8
class ComparatorImp implements Comparator<Person>{
public int compare(Person p1, Person p2) {
if(p1.name.compareTo(p2.name) < 0)
return -1;
else
return (p1.name.compareTo(p2.name) > 0) ? 1 : 0;
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class TestComparable {
public static void main(String[] args) {
Person[] aPersons = new Person[4];
aPersons[0] = new Person("Jony");
aPersons[1] = new Person("Pun");
aPersons[2] = new Person("HelloKitty");
aPersons[3] = new Person("Brown");
Arrays.sort(aPersons);
for(Person p: aPersons ) {
System.out.print(p.name + " ");
}
System.out.println();
Arrays.sort(aPersons, new ComparatorImp());
for(Person p: aPersons ) {
System.out.print(p.name + " ");
}
System.out.println();
List<Person> lperson = new LinkedList<Person>();
for(Person p : aPersons) {
lperson.add(p);
}
Collections.sort(lperson);
for(int i = 0 ; i < lperson.size(); i++) {
System.out.print(lperson.get(i).name+ " ");
}
}
}


-------------本文结束 感谢您的阅读-------------

本文标题:Comparable 和 Comparator比较

文章作者:ElwinHe

发布时间:2017年10月08日 - 09:10

最后更新:2017年11月15日 - 23:11

原始链接:http://www.elwinhe.xyz/blog/ae6b923/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!
0%