Java Comparator和Comparabler的区别

 时间:2024-07-04 10:32:55

当需要排序的集合或数组时可以使用Comparator或Comparable,它们都可以实现排序,但是它们的区别是Comparator从外部定义了对象的比较规则,而Comparable则是从内部定义了对象是可比较的。下面将详细解这句话。

方法/步骤

1、一粑颇岔鲷、Comparator  Comparator从外部定义了对象的比较规则  比如,你要使用某人写鹚兢尖睁的一个矩形类Rect。现在你有一个Rect的集合(或数组),你想实现对Rect的排序,现在有一个问题,某人在实现Rect的时候没有考虑到会有人将会比较Rect对象。这个时候你必须根据需要对Rect进行排序(比如,根据矩形的长进行排序),在这个场景下使用Comparator,因为Rect类已经存在,你不能对其进行改变。[java]viewplaincopyprint?importjava.util.*;publicclassRectangle{publicstaticvoidmain(String[]args){Rect[]rectArrays=newRect[]{newRect(3,4),newRect(5,2),newRect(4,5)};//排序,将定义的RectComparator作为参数Arrays.sort(rectArrays,newRectComparator());for(inti=0;i!=rectArrays.length;++i)System.out.println(rectArrays[i]);}//定义一个Rect比较方式:根据Rect的长比较publicstaticclassRectComparatorimplementsComparator<Rect>{publicintcompare(Recto1,Recto2){returno1.getLength()-o2.getLength();}}publicstaticclassRect{Rect(intl,intw){this.length=l;this.width=w;}publicintgetLength(){returnthis.length;}publicintgetWidth(){returnthis.width;}publicintgetArea(){returnthis.length*this.width;}publicStringtoString(){return"length:"+length+"width:"+width;}privateintlength;privateintwidth;}}输出:length:3width:4length:4width:5length:5width:2

2、Comparable  Comparable则是从内部定义了对象的是可比较的  还是以Rect为例,假如你是Rect的实现者,在你定义Rect时,你觉得有必要定义一个比较方式,这个时候就应该使Rect继承Comparable接口。如果你觉得较合理的排序方式是根据Rect的面积进行排序,那么可以这样实现[java]viewplaincopyprint?importjava.util.*;publicclassRectangle{publicstaticvoidmain(String[]args){Rect[]rectArrays=newRect[]{newRect(3,4),newRect(5,2),newRect(4,5)};Arrays.sort(rectArrays);for(inti=0;i!=rectArrays.length;++i)System.out.println(rectArrays[i]);}//定义了Comparable接口publicstaticclassRectimplementsComparable<Rect>{Rect(intl,intw){this.length=l;this.width=w;}publicintgetLength(){returnthis.length;}publicintgetWidth(){returnthis.width;}publicintgetArea(){returnthis.length*this.width;}publicStringtoString(){return"length:"+length+"width:"+width;}//重载compareTo函数,按面积比较@OverridepublicintcompareTo(Rectthat){returnthis.getArea()-that.getArea();}privateintlength;privateintwidth;}}输出:length:5width:2length:3width:4length:4width:5

3、总结通过Comparator和Comparable的意思我们也可以看出两者的区别Comparable意为“可比较的”,一个类继承了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。Comparator意为“比较算子”,因此Comparator可以看成一种算法的实现,将算法和数据分离。  另外,通过定义方式,我们可以发现如果一个类继承了Comparable接口,则表明这个类的对象之间是可以比较的,且比较的方式只有一种。但是Comparator可以定义多种比较方式。在第二个程序中,Rect定义了按面积进行比较,如果我们想按长对Rect进行排序,那么也可以通过Comparator来实现。

java实体类多属性排序 Comparator接口达到想要的排序结果 java对象比较的实现模式,如何实现java对象比较 java集合排序方法 Java容器简介
热门搜索
旅游工艺品批发 呼和浩特旅游网 南岳旅游 国内的旅游胜地 岛多多海岛旅游论坛 福田风景快运柴油版 四川九寨沟风景名胜区 手绘风景 风景优美的电影 神龙架风景区