Comparable
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
Comparable接口是内比较器,也就是自己参与比较,需要实现compareTo方法。Comparable的compareTo方法需要传入一个对象,然后自己和该对象比较。
有三种情况
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
package algorithm;
public class Person implements Comparable<Person> { //Comparable后面的泛型不一定和当前类一样,可以是别的类,只要能把compareTo的算法写好就行,并不要求相同class比较。但是如果想要使用Collections.sort或Arrays.sort进行自动排序就必须是相同的class。
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public int compareTo(Person person) {
if (this.name.compareTo(person.name) > 0)
return 1;
else if (this.name.compareTo(person.name) == 0)
return 0;
else
return -1;
}
public String getName() {
return name;
}
}
public static void main(String[] args) throws Exception { Person d1 = new Person("c"); Person d2 = new Person("c"); Person d3 = new Person("b"); Person d4 = new Person("d"); System.out.println(d1.compareTo(d2)); System.out.println(d1.compareTo(d3)); System.out.println(d1.compareTo(d4)); }
结果
0 1 -1
Comparator
Comparetor是外比较器,相当于它本身不作为比较的对象,它提供的是一个比较平台。
package algorithm; public class Person { private String name; public Person() { } public Person(String name) { this.name = name; } public String getName() { return name; } }
public static void main(String[] args) throws Exception { Person d1 = new Person("c"); Person d2 = new Person("a"); Person d3 = new Person("b"); List<Person> persons = new ArrayList<>(); persons.add(d1); persons.add(d2); persons.add(d3); List<Person> orderPersons = sort(persons);; for(Person person:orderPersons){ System.out.println(person.getName()); } } public static List<Person> sort(List<Person> persons){ Collections.sort(persons, new Comparator<Person>(){ public int compare(Person o1, Person o2) { if (o1.getName().compareTo(o2.getName()) > 0) return 1; else if (o1.getName().compareTo(o2.getName()) == 0) return 0; else return -1; } }); return persons; }
结果是
a b c
这个是Comparator的匿名类的用法,当然也可以实现一个接口,哪个类实现了该接口就是作为一个比较器。
Comparator的用法耦合度会低一些。