Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator
是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法 或 在集合内实现 Comparable 接口的方法(当然后
者在集合内实现则可以直接访问private 数据域)。
Comparable 用作默认的比较方式,需要对排序对象本身做修改
Comparator 用作自定义的比较方式,当默认的比较方式不适用时或者没有提供默认的比较方式,使用Comparator就非常有用。相对比较灵活,可比较
自定义的类,也可以比较自带的类,如想对Integer采用绝对值大小排序。
注意,Comparator接口中,不重写 Object.equals(Object) 方法总是 安全的。此方法必须遵守 Object.equals(Object) 的常规协定。(如
自反性、传递性、对称性、一致性)。boolean equals(Object obj)方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规
协定,该协定声明相等对象必须具有相等的哈希码。
好啦,上源码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* 该源码展示了接口Comparator与Comparable的区别
*
* @author guowei.magw
*
*/
public class ComparatorTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Person> list = new ArrayList<Person>();
list.add(new Person(1, "ma" , 18));
list.add(new Person(18, "Zhang" , 15));
list.add(new Person(3, "Li", 23 ));
list.add(new Person(6, "Wang" ,40));
Collections.sort(list);
System.out.println("************The Comparable Result **************");
for (Person p : list){
System.out.println(p);
}
//新建匿名类
Collections.sort(list,new Comparator<Person>(){
@Override
public int compare( Person o1, Person o2) {
//return o1.getEnd()-o2.getEnd()==0? 0:(o1.getEnd()-o2.getEnd()>0?1:-1);
return o1.getAge()-o2.getAge();
}
});
Collections.sort(list, new PersonNameComparator());
System.out.println("************The PersonNameComparator Result **************");
for (Person p : list){
System.out.println(p);
}
}
}
class Person implements Comparable<Person>{
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public Person(int id, String name, int age){
this.id=id;
this.name=name;
this.age=age;
}
public String toString(){
return String.format("Id: %4d , Name: %8s , Age: %3d ",id,name,age);
}
/**
* 若两个人的Id和姓名都一样,我们判断这两个人都相等
*/
public boolean equals(Object b){
Person st=null;
if (b instanceof Person){
st=(Person) b;
}else{
return false;
}
if (st.name == this.name && st.id==st.id){
return true;
}else{
return false;
}
}
/**
* 按 id 递增排序
*/
public int compareTo(Person o) {
//return this.beg - o.getBeg()== 0? 0:(this.beg - o.getBeg()>0?1:-1);
return this.id-o.getId();
}
}
class PersonNameComparator implements Comparator<Person>{
@Override
public int compare( Person o1, Person o2) {
//return o1.getEnd()-o2.getEnd()==0? 0:(o1.getEnd()-o2.getEnd()>0?1:-1);
return o1.getName().compareToIgnoreCase(o2.getName());
}
}