java中需要对对象进行排序时,那么这个对象需要实现Comparable,Comparable接口是一个排序接口,当对象实现了这个接口就支持排序。这个可以参考jdk中的String实现。下面看一段代码。
person类,实现了Comparable接口,按照年龄进行排序,年龄相同时按照姓名进行排序,String类已经实现了Comparable接口,直接调用compareTo方法即可
public class Person implements Comparable{
private String name;
private int age;
//构造方法
//set、get代码...
public int compareTo(Person p) {
// TODO Auto-generated method stub
if (this.age == p.age) {
return this.name.compareTo(p.name);
} else {
return this.age - p.age;
}
}
}
调用
public static void main(String[] args) {
List list = new ArrayList();
Person p1 = new Person("A1", 10);
Person p2 = new Person("A2", 8);
Person p3 = new Person("A3", 9);
Person p4 = new Person("A5", 6);
Person p5 = new Person("A4", 6);
Person p6 = new Person("A6", 12);
Person p7 = new Person("A7", 5);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
Collections.sort(list);
for (Person p : list) {
String s = p.toString();
System.out.println(s);
}
}
结果:
name:A7;age:5
name:A4;age:6
name:A5;age:6
name:A2;age:8
name:A3;age:9
name:A1;age:10
name:A6;age:12
如果person类没有实现Comparable接口,那么我们在外部调用排序时就需要使用到Comparator接口
public static void main(String[] args) {
List list = new ArrayList();
Person p1 = new Person("A1", 10);
Person p2 = new Person("A2", 8);
Person p3 = new Person("A3", 9);
Person p4 = new Person("A5", 6);
Person p5 = new Person("A4", 6);
Person p6 = new Person("A6", 12);
Person p7 = new Person("A7", 5);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
//Collections.sort(list);
Collections.sort(list, new Comparator() {
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
if (p1.getAge() == p2.getAge()) {
return p1.getName().compareTo(p2.getName());
} else {
return p1.getAge() - p2.getAge();
}
}
});
for (Person p : list) {
String s = p.toString();
System.out.println(s);
}
}
结果:
name:A7;age:5
name:A4;age:6
name:A5;age:6
name:A2;age:8
name:A3;age:9
name:A1;age:10
name:A6;age:12
可以看到实现了接口Comparable和外部使用Comparator接口结果相同。
总结:
不同点:
Comparable是一个内部比较接口,通常对象需要内部排序时直接实现
Comparator是一个外部比较接口,通常在对象中没有实现排序接口而有需要进行排序时实现
相同点:
两个的功能相似,只不过一个是内部一个是外部。