对象的比较comparable与comparator

来源:互联网 发布:手机天猫 手机淘宝 编辑:程序博客网 时间:2024/05/17 23:41

在java中,同一个类的实例之间经常需要进行比较。如果有两个employee对象,你很可能需要知道他们之中哪一位在这家公司待的更久一些,或者希望按年龄升序或者降序排列之后再显示搜索结果。通过实现java.lang.Comparable和java.uti.Comparator接口,可以使对象具有可比较性。

一、使用java.lang.Comparable

实现了java.lang.Comparable接口,就必须重写它的抽象方法compareTo()

public int compareTo(T o);

@Overridepublic int compareTo(Person o) {if (this.age > o.age) {return 1;} else if (this.age < o.age) {return -1;} return 0;}

这样这个对象就具备了比较性,并且使用java.util.Arrays的静态方法sort可以对任意对象数组进行排序。compareTo方法中的参数o是指这个对象进行比较的对象。如果这个对象大于参数对象,这个方法在实现类中的代码就必须返回一个正值;如果这个对象小于参数对象,则返回一个负值。默认这个规则是升序的,若想降序,则可以使正负值相调换即可。

二、实现java.lang.Comparator

实现java.lang.Comparable使你能够定义一种对类的实例进行比较的方法。然而,对象有的时候可以通过多种方式进行比较。例如,俩个Person对象可能需要按照年龄或者姓名比较,这时使用第一种方式就不行了,因为第一种方式只能在类中定义一种比较。为了使对象具有俩种比较方式,这就需要实现java.lang.Comparator接口,定义两个比较器来进行比较。重写抽象方法compare

int compare(T o1, T o2);
@Overridepublic int compare(Person o1, Person o2) {if (o1.getAge() > o2.getAge()) {return 1;} else if (o1.getAge() < o2.getAge()) {return -1;}return 0;}

另外再依照这个比较器重写一个按姓名比较的比较器,此处偷懒!

集合排序或者是数组排序都有传入比较器进行比较或者排序的方法。下图是Collections和Arrays的带有比较器的排序方法

    public static <T> void sort(List<T> list, Comparator<? super T> c) {        list.sort(c);    }

   public static <T> void sort(T[] a, Comparator<? super T> c)

三、总结

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码,。用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。


原创粉丝点击