如何给对象排序

当我们排序的对象不止是简单的数据类型的时候

我们可以通过实现Comparable和Comparator接口来完整对对象的排序

Comparable和Compartor的区别?

Comparable是一个自身已经支持自比较的(如String,Integer)的接口

Comparator可以说是一个专用的比较器当对象本身不支持自排序和自比较函数的时候

我们可以通过实现Compartor来比较两对象的大小

Comparable是一个比较通用的接口用户可以通过他实现排序功能

而Comparator可以看作一种算法一种设计模式(可以看作是一个策略模式就是不改变对象自身,而用一个策略对象改变对象行为)

Comparable相对比较固定与具体类绑定,

Comparator比较灵活可以与任何需要实现功能的类绑定

Comparable可以说是静态绑定

Comparator可以说是动态绑定

Comparable

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的compareTo方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。

对于类C的每一个e1和e2来说,当且仅当(e1.compareTo((Object)e2)==0)与e1.equals((Object)e2)具有相同的布尔值时,类C的自然排序才叫做与equals一致。注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也会抛出NullPointerException。

强烈推荐(虽然不是必需的)使自然排序与equals一致。这是因为在使用其自然排序与equals不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据equals方法定义的集合(或映射表)的常规协定。

而Comparator

比较函数强行对某些对象collection进行整体排序。可以将Comparator传递给sort方法(如Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如TreeSet或TreeMap)的顺序。

当且仅当对于一组元素S中的每个e1和e2而言,(compare((Object)e1,(Object)e2)==0)与e1.equals((Object)e2)具有相等的布尔值时,Comparatorc强行对S进行的排序才叫做与等号一致的排序。

当使用具有与等号一致的强行排序能力的comparator对有序set(或有序映射)进行排序时,应该小心谨慎。假定一个带有显式Comparatorc的有序set(或有序映射)与从setS中抽取出来的元素(或键)一起使用。如果c强行对S进行的排序与等号一致,那么有序set(或有序映射)将是行为“怪异的”。尤其是那些将违背根据equals所定义set(或映射)的常规协定的有序set(或有序映射)。

相关推荐