目前我只认识到:
Comparable:一些类已经实现了该接口,实现该结构来实现内在排序。如sort排序。
Comparator:在TreeMap和TreeSet容器的构造器里会使用该类参数来实现容器内置排序,好像还有一些排序的函数使用该类参数。
对于自己的实现的类可以impletements Comparable来使用sort(Object[]o)函数或者构造一个实现comparator的类来使用Arrays.sort(Object[] o,Comparator c).大家来讨论一下,对它俩的区别和用法发表自己的看法。
Comparable:一些类已经实现了该接口,实现该结构来实现内在排序。如sort排序。
Comparator:在TreeMap和TreeSet容器的构造器里会使用该类参数来实现容器内置排序,好像还有一些排序的函数使用该类参数。
对于自己的实现的类可以impletements Comparable来使用sort(Object[]o)函数或者构造一个实现comparator的类来使用Arrays.sort(Object[] o,Comparator c).大家来讨论一下,对它俩的区别和用法发表自己的看法。
事实上因为一个对象可以有多种排序方式,所以Comparable是不够的!
比如Collections.sort(Object o, Comparator c)是用来排序的,但究竟根据什么排序,确切的是怎样定义数组(也可以是集合类对象)中元素的大小关系,比如a1为什么比a2大,这就需要你给它一个策略,而Comparator c就是你传给sort的排序策略。
只用写一个类函数Comparator
要写一个类~
1,如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序
2,为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
BTW,Comparator实际上是DP中的Strategy模式的典型应用。
因为Comparator是动态定义排序规则,Comparable是静态定义的。
我就不说了.
总之:Comparator更灵活
我觉得基本上已经讨论明白了:
一:Comparable静态绑定在类上,只能有一种排序方式。
二:Comparator通过方法动态绑定在类上,使用不同的实现Comparator的类就可以实现不同的排序方式,所以比较灵活。
treeroot的话经典:
“因为Comparable不够用,所以有加了Comparator!事实上因为一个对象可以有多种排序方式,所以Comparable是不够的!”
Polarislee让我更加清晰明白了他们的用处。大家给我指正一下我的总结。同时大家讨论一下treeroot和Polarislee两位大侠分歧的地方:对于Comprable使用的必要性。谢谢大家了
如果我只有一种排序方式(事实上多数情况是这样的),就没有必要使用Comparator了!
可是Comparable可以带来方便,可以认为Comparator是Comparable的扩展!
至少从兼容性考虑也不可能把Comparable去掉!