一、Comparable接口
Comparable 是排序接口。
一个类实现了Comparable接口,然后重写其compareTo方法,就意味着“该类支持排序”。把该类对象存储在 List列表或数组中,则该List列表或数组就可以通过 Collections.sort 或 Arrays.sort 进行排序。
另外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
二、Comparator接口
Comparator 是比较器接口。
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
三、代码实现
package cn.tedu.test;
import java.util.*;
public class Test03 {
public static void main(String[] args) {
Person person = new Person("1", 1);
Person person2 = new Person("1", 2);
Person person3 = new Person("2", 3);
Person person4 = new Person("3", 4);
Person person5 = new Person("4", 5);
Person person6 = new Person("5", 6);
ArrayList<Person> objects = new ArrayList<>();
objects.add(person);
objects.add(person2);
objects.add(person3);
objects.add(person4);
objects.add(person5);
objects.add(person6);
//方法一
Collections.sort(objects);
Iterator<Person> iterator = objects.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//方法二
Collections.sort(objects, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age-o2.age;
}
});
Iterator<Person> iterator2 = objects.iterator();
while (iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
public static void main(String[] args) {
Person person = new Person("1", 1);
Person person2 = new Person("1", 2);
Person person3 = new Person("2", 3);
Person person4 = new Person("3", 4);
Person person5 = new Person("4", 5);
Person person6 = new Person("5", 6);
//实现了Comparable 接口的对象重写过compareTo方法后,在TreeSet这种有序容器中会自然排序。
TreeSet<Person> objects = new TreeSet<>();
objects.add(person);
objects.add(person2);
objects.add(person3);
objects.add(person4);
objects.add(person5);
objects.add(person6);
Iterator<Person> iterator = objects.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
class Person implements Comparable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
Person p= (Person) o;
return p.age-this.age;
}
}