Java比较器的使用

Posted by 小白 on December 25, 2016

比较器一般用于对自定义类的比较,比如我自定义了一个Person类,又有一个集合personList的元素全都是这个自定义类的实例person1、person2等,想要使用Collections.sort(personList)对集合进行排序,就需要使用比较器。

Java有两种比较器的实现,Comparable和Comparator。

Comparable

第一种方式,让自定义类实现Comparable接口,然后实现其方法compareTo() 。

public class Person implements Comparable {
    int num;

    String name;

    public Person(int num, String name) {
        this.num = num;
        this.name = name;
    }

    @Override
    public String toString() {
        return "\r\tnum:"+num+" name:"+name+"\r";
    }

    public int compareTo(Object o) {
        Person tmp=(Person) o;
        int result=tmp.num>num?1:(tmp.num==num?0:-1);
        if (result==0) {
            result=tmp.name.indexOf(0)>name.indexOf(0)?1:-1;
        }
        return result;
    }
}

测试方法

public static void main(String[] args) {
        List<Person> list=new ArrayList<Person>(10);
        list.add(new Person(1,"jj"));
        list.add(new Person(0,"ww"));
        list.add(new Person(0,"kk"));
        list.add(new Person(2,"ll"));
        Collections.sort(list); 
        System.out.println(list);
    }

Comparator

第二种方法,在外部实现一个自定义比较器

public class Person{
    int num;

    double salary;

    public Person(int num, double salary) {
        this.num = num;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "\r\tnum:"+num+" name:"+salary+"\r";
    }
}
public class PersonComparator implements Comparator{
    public int compare(Object o1, Object o2) {
        Person t1=(Person) o1;
        Person t2=(Person) o2;
        int result=t1.num>t2.num?1:(t1.num==t2.num?0:-1);
        return result=result==0?(t1.salary<t2.salary?1:-1):result;
    }
}

测试方法

  public static void main(String[] args) {
        List<Person> t=new ArrayList<Person>(10);
        t.add(new Person(1,12));
        t.add(new Person(0,13));
        t.add(new Person(0,14));
        t.add(new Person(2,15));
        Collections.sort(t,new PersonComparator()); //外部比较器:通过实现Comparator接口
        System.out.println(t);
    }

小结

Java之所以用java.lang.Compareable,java.util.Comparator,前者是为了当你写一个类时,你要是要使它能够排序,可以选择实现,当你没实现,而后来又想实现排序功能时,两种解决办法,一是重写此类,让它实现Compareable接口,但一般不这么用,为了满足开闭原则,所以选择后者,写一个此类的比较类,实现Comparator。