Java集合框架:Comparator

最近编写Comparator经常抛出异常,促使我较深入学习下Java的Comparator。本文介绍。。。

待整理。。。。。

 

Comparator是Java的一个接口,官方文档见这里Interface Comparator<T>

 

Comparator最常这用使用:Collections.sort和Arrays.sort

//Arrays.sort
public static <T> void sort(T[] a, Comparator<? super T> c)
//Collections.sort
public static <T> void sort(List<T> list, Comparator<? super T> c)

//举例
Collections.sort(list, new Comparator() {
    public int compare(Object o1, Object o2) {  //实现compare函数
       Message    m1 = (Message)o1;
        Message    m2 = (Message)o2;
        double diff = m1.getReceiveTime() - m2.getReceiveTime();
        return (diff==0 ? 0 : (diff>0 ? 1 : -1));
    }
});

new Comarator默认是升序的。。。。

 

使用规则:

编写Comparator,需要符合一定的规则,否则会抛出异常。

如果在排序时要实现第一域相等,则按等二个域排序(Excel常用的一个数据排序功能),其实也不难,见如下例子(例子来源于StackOverflow,点这里)。

public class Person {
    private String firstName;
    private String lastName;
    private String age;
}

public int compareTo(Person p1, Person p2) {
    int i = p1.firstName.compareTo(p2.firstName);
    if (i != 0) return i;

    i = p2.lastName.compareTo(p2.lastName); //若First name相等,则比较last name
    if (i != 0) return i;

    return Integer.valueOf(p1.age).compareTo(Integer.valueOf(p2.age); //名和姓都相等,则按年龄排序
}

总之,只要符合上面的规则,怎么排序都可以。

 

我很好奇的是,如果不按上面方法,多个域排序,两个域相等,那他们的顺序取决于什么?

发表评论

电子邮件地址不会被公开。 必填项已用*标注