实现比较接口与比较器接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则。
1.Comparable:
此接口强行对实现它的每个类的对象进行整体排序。排序此被称为该类的自然排序 ,类的 的compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以使用有序映射表中的键或有序集合中的元素,无需指定比较器。强烈推荐(虽然不是必须的)使自然排序与等于一致。所谓与等于一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2)== 0) 与e1.equals((对象)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与equals一致 。
2. Comparator:
是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较.Comparator体现了一种策略模式),就是不改变对象自身,而用一个策略对象(策略对象)来改变它的行为。
不同之处:
1排序规则实现的方法不同
Comparable接口的方法:compareTo(Object o)
比较器接口的方法:比较(T o1,To2)
2类设计前后不同
可比接口用于在类的设计中使用;
比较器接口用于类设计已经完成,还想排序(阵列);
Comparator和Comparable的区别:
可比
比较定义在Person类的内部:
public class Persion实现了Comparable {..比较Person's大小..},
因为已经实现了比较器,那么我们的人现在是一个可以比较大小的对象了,它的比较功能和字符串完全一样,可以随时随地的拿来
比较大小,因为人现在自身就是有大小之分的.Collections.sort(personList)可以得到正确的结果。
比较
Comparator是定义在Person的外部的,此时我们的Person类的结构不需要有任何变化,如
public class Person {String name; int age},
然后我们另外定义一个比较器:
public PersonComparator实现Comparator(){..比较Person的大小..},
在PersonComparator里面实现了怎么比较两个人的大小。所以,用这种方法,当我们要对一个personList进行排序的时候,
我们除了了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person's大小是在PersonComparator
里面实现的,如:
Collections.sort(personList,new PersonComparator())。
Comparator和Comparable的实例:
可比:
实现Comparable接口要覆盖compareTo方法,在compareTo方法里面实现比较:
公共类Person实现Comparable {
字符串名称;
整年龄
public int compareTo(Person another){
int i = 0;
i = name.compareTo(another.name); //使用字符串的比较
if(i == 0){//如果名字一样,比较年龄,返回比较年龄结果
回归年龄 - another.age;
} else {
回报我; //名字不一样,返回比较名字的结果。
}
}
}
这时我们可以直接用Collections.sort(personList)对其排序了。
比较:
实现比较器需要覆盖比较方法:
public class Person {
字符串名称;
整年龄
}
类PersonComparator实现比较器{
public int compare(Person one,Person another){
int i = 0;
i = one.name.compareTo(another.name); //使用字符串的比较
if(i == 0){//如果名字一样,比较年龄,返回比较年龄结果
返回one.age - another.age;
} else {
回报我; //名字不一样,返回比较名字的结果。
}
}
}
Collections.sort(personList,new PersonComparator())可以对其排序
总结:
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,
但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自
己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。