Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
package com.pp.comparable;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
}
return age;
}
}
package com.pp.comparable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
public class MainClass {
public static void main(String[] args) {
Person p0 = new Person("xiaoming", 5);
Person p1 = new Person("xiaohong", 1);
Person p2 = new Person("xiaowang", 3);
Person p3 = new Person("xiaoli", 4);
System.out.println("Person实现Comparable接口,重写CompareTo方法,把Person作为map的键来排序");
TreeMap<Person, String> pdata = new TreeMap<Person, String>();
pdata.put(p0, "ming");
pdata.put(p1, "hong");
pdata.put(p2, "wang");
pdata.put(p3, "li");
Set<Person> keys = pdata.keySet();
for (Person p : keys) {
System.out.println(p.toString());
}
System.out.println("------创建set的时候传入比较器---------");
Set<Person> set = new TreeSet<Person>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
set.add(p0);
set.add(p1);
set.add(p2);
set.add(p3);
for (Person p : set) {
System.out.println(p.toString());
}
System.out.println("--使用Collections.sort(list,comparator)方法,不需要在创建的时候传入比较器--");
List<Person> list = new ArrayList<Person>();
list.add(p0);
list.add(p1);
list.add(p2);
list.add(p3);
Comparator<Person> cpt = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
Collections.sort(list, cpt);
for (Person p : list) {
System.out.println(p.toString());
}
}
}
Person实现Comparable接口,重写CompareTo方法,把Person作为map的键来排序
Person [name=xiaohong, age=1]
Person [name=xiaowang, age=3]
Person [name=xiaoli, age=4]
Person [name=xiaoming, age=5]
------创建set的时候传入比较器---------
Person [name=xiaohong, age=1]
Person [name=xiaowang, age=3]
Person [name=xiaoli, age=4]
Person [name=xiaoming, age=5]
--使用Collections.sort(list,comparator)方法,不需要在创建的时候传入比较器--
Person [name=xiaohong, age=1]
Person [name=xiaowang, age=3]
Person [name=xiaoli, age=4]
Person [name=xiaoming, age=5]