当前位置: 首页 > 后端技术 > Java

Comparable和Comparator接口之间的区别?还在傻傻的迷茫吗?

时间:2023-04-01 19:29:00 Java

Comparable简介Comparable是排序界面。如果一个类实现了Comparable接口,就意味着“这个类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(例如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而无需指定比较器。该接口使用x.compareTo(y)来比较x和y的大小。如果它返回负数,则表示x小于y;如果它返回零,则意味着x等于y;如果返回正数,则表示x大于y。Comparator简介Comparator是一个比较器接口。如果我们需要控制某个类的排序,而该类本身不支持排序(即没有实现Comparable接口);然后,我们可以创建一个“这个类的比较器”来排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类”来创建一个新的比较器,然后通过这个比较器对类进行排序。intcompare(To1,Too2)类似于上面的x.compareTo(y),定义排序规则后返回正数,零和负数分别代表大于、等于和小于。两个Comparable的连接相当于“内部比较器”,Comparator相当于“外部比较器”。代码实现包com.github.compare;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;/***@_ooOoo_*o8888888o*88"."88*(|-_-|)*O\=/O*____/`---'\____*.'\\||//`。*/\\|||:|||//\*/_|||||-:-|||||-\*||\\\-///||*|\_|''\---/''||*\.-\__`-`___/-./*___`。.'/--.--\`。.__*.""'<`.___\_<|>_/___.'>'“”。*||:`-\`.;`\_/`;.`/-`:||*\\`-。\___\/___/.-`//*======`-.____`-.___\_____/___.-`____.-'======*`=---='*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*佛祖保佑永远BUG*@DESCRIPTIONComparable是一个排序接口;如果一个类实现了Comparable接口,则表示“该类支持排序”*Comparable相当于“内部比较器”*@AUTHOR宋宏伟*@PACKAGE_NAMEcom.github.compare**/publicclassComparableAndCompartor{publicstaticvoidmain(String[]args){Listhouses=newArrayList();房子h1=新房子(95.0,12000);房子h2=新房子(110.0,12160);房子h3=新房子(80.0,16300);Househ4=newHouse(150.3,10690);房子.添加(h1);房子.add(h2);房子.add(h3);房子.添加(h4);可比(房屋);比较器(房屋);}/***@DESCRIPTIONHouse类实现了Comparable接口,并重写了compareTo方法,所以在执行Collections.sort方法时,会调用重写的compareTo方法*@AUTHORSongHongWei*@TIME2018/12/14-16:46*@CLASS_NAMEComparableAndCompartor**/privatestaticvoidcomparable(Listhouses){System.out.printf("排序前的顺序,%s\n",houses);收藏品排序(房屋);System.out.printf("按面积排序后的顺序,%s\n",houses);}privatestaticvoidcomparator(Listhouses){System.out.printf("Unsortedorder,%s\n",houses);Collections.sort(houses,newComparatorDetail());System.out.printf("按单价排序,%s\n",houses);}/***@DESCRIPTION实现Compatator接口,重写compare方法,按单价倒序排序*@AUTHORSongHongWei*@TIME2018/12/14-16:49*@CLASS_NAMEComparableAndCompartor**/staticclassComparatorDetail实现Comparator{@Overridepublicintcompare(Houseo1,Houseo2){if(o1.priceo2.price)返回-1;返回0;}}}packagecom.github.compare;/***@_ooOoo_*o8888888o*88"."88*(|-_-|)*O\=/O*____/`---'\____*.'\\||//`。*/\\|||:|||//\*/_|||||-:-|||||-\*||\\\-///||*|\_|''\---/''||*\.-\__`-`___/-./*___`。.'/--.--\`。.__*.""'<`.___\_<|>_/___.'>'“”。*||:`-\`.;`\_/`;.`/-`:||*\\`-。\___\/___/.-`//*======`-.____`-.___\_____/___.-`____.-'======*`=---='*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*佛祖保佑永不BUG*@DESCRIPTION一个房子对象,有面积和单价两个属性*@AUTHOR宋宏伟*@PACKAGE_NAMEcom.github.compare**/publicclassHouseimplementsComparable{/*面积房子*/受保护的双倍比例;/*房子每平方米的售价*/protecteddoubleprice;公屋(双倍比例,双倍价格){this.proportion=比例;这个。价格=价格;}/***@DESCRIPTION重写compareTo方法,用房子的面积来比较大小*@AUTHOR宋宏伟*@TIME2018/12/14-16:18*@CLASS_NAME房子**/@OverridepublicintcompareTo(Houseo){/*当前物体的面积大,返回正数*/if(this.proportion>o.proportion)return1;/*当前面积小,返回负数*/elseif(this.proportionlist);Collections.sort(Listlist,Comparatorc)如果待排序的列表中包含数字或字符,可以直接使用Collections.sort(list);当待排序的集合或数组不是纯数字类型时,需要自己定义排序规则,实现一个Comparator比较器Collections调用Collections.sort(list)方法,该方法传递一个List集合。这里,List泛型中包含的元素必须实现Compareable接口。此外,列表中的所有元素必须是相互可比较的(即,e1.compareTo(e2)不得为列表中的任何e1和e2元素抛出ClassCastException)。Java源代码是这样写的列表中的所有元素都必须实现{@linkComparable}接口。此外,列表中的所有元素必须相互比较(即{@codee1.compareTo(e2)}不得为任何elementsCollections.sort抛出{@codeClassCastException}sourcepublicstatic>voidsort(Listlist){Object[]a=list.toArray();Arrays.sort(a);ListIteratori=list.listIterator();for(intj=0;j=0)runHi++;}返回runHi-lo;}来源:blog.csdn.net/u010859650**/article/details/85009595近期文章推荐:1.1,000+Java面试题及答案(2021最新版)2.厉害了!Java协程来了。..3.玩大!Log4j2.x再次爆发。..4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!