对象的比较comparable与comparator

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

一、使用java.lang.Comparable

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

public int compareTo(T o);

	@Override
	public 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);
	@Override
	public 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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。


发布了40 篇原创文章 · 获赞 22 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章