对于Comparable接口来说,仅包含一个compareTo方法,public int compareTo(Object o) {},仅有一个参数。
对于Comparator接口来说,仅包含一个compare方法,public int compare(Object o1, Object o2) {},有两个参数。Comparator一般会被单独实现。
实现Comparator接口的类被称作比较器。
package pac;
class User implements Comparable{
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return this.age-((User)o).getAge();
}
private String id;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String id, int age) {
super();
this.id = id;
this.age = age;
}
}
public class Demo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
User u1=new User("001",18);
User u2=new User("002",20);
if(u1.compareTo(u2)>0) System.out.println(u1.getId()+"大");
else System.out.println(u1.getId()+"小");
}
}
</pre><pre code_snippet_id="1868765" snippet_file_name="blog_20160906_3_4773828" name="code" class="java">package pac;
import java.util.Comparator;
class Users{
private String id;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Users(String id, int age) {
super();
this.id = id;
this.age = age;
}
}
class UserComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return ((Users)o1).getAge()-((Users)o2).getAge();
}
}
public class Demo3 {
public static void main(String[] args) {
Users u1=new Users("001",18);
Users u2=new Users("002",20);
Comparator cmp=new UserComparator();
if(cmp.compare(u1, u2)>0) System.out.println(u1.getId()+"大");
else System.out.println(u1.getId()+"小");
}
}
当想要使用元素自身的自然顺序对元素进行排序时,就可以通过实现Comparable接口来实现
public class Person implements Comparable {
public int compareTo(Object o) {
.................
}
}
当不想使用元素自身的自然顺序,而是想使用自定义的顺序进行排序时,此时要让集合自身具备比较功能,要定义一个类实现Comparator接口,覆盖campare()方法,可以将该类对象作为参数传递给TreeSet,实现自定义排序
public TreeSet(Comparator comparator);
public class PersonComparator implements Comparator {
public int compare(Object o1, Object o2) {
.....................
}
}
Comparable接口对实现它的每个类的对象进行整体排序
Comparator接口实现对对象collection进行整体排序,可以将Comaprator传递给:
Collection.sort()方法,实现对List排序进行精确控制
Arrays.sort()方法,实现对数组排序进行精确控制
TreeSet的构造函数,实现对TreeSet集合进行精确控制
TreeMap的构造函数,实现对TreeMap进行精确控制。
传入的Comparator对象必须覆盖compare方法。