关于comparator接口和comparable接口以及它们各自的方法compare()和compareTo()
在今天做的LeetCode的题中有两道都出现了利用接口实现对象的排序。两题的相关链接:
因为之前都没接触过这两个接口。一时不能明确它们的作用,所以在网上查找了非常多资料。如今大致弄清楚一些。如今记录下来,有什么欠缺,欢迎大家及时指正
1.Comparable<T>接口
在java API文档中描写叙述此接口是强行将实现它的每个类的对象进行总体排序-----称为该类的自然排序,实现此接口的对象列表和数组能够用Collections.sort(),和Arrays.sort()进行自己主动排序。
也就是说,仅仅要实现了这个接口的对象(数组)就相当于有了排序的能力。所以叫做comparable---可排序的。所以能够说这是一种内部排序的方式,通过实现它唯一的方法compareTo(),关于此方法以下会再提及;
2.Comparator<T>接口
对于它,则是针对一些本身没有比較能力的对象(数组)为它们实现比較的功能。所以它叫做比較器,是一个外部的东西,通过它定义比較的方式,再传到Collection.sort()和Arrays.sort()中对目标排序,并且通过自身的方法compare()定义比較的内容和结果的升降序。
3.关于排序结果升降序的疑问
学习使用这两个接口的时候,看到每一个实现它们的程序都是这样做的
对于compareTo():
public int compareTo(Object o){ return this.val-o.val; //假定比較的是val属性 }
这样就能对实现comparable接口的对象进行升序排序了;
而对于compare()方法呢,则是这样:
升序: public int compare(Object a,Object b){ return a.val-b.val; } 降序: public int compare(Object a,Object b){ return b.val-a.val; }
当看到这两个方法实现时。我一时感觉有点懵了,去看API文档,可是里面仅仅是有提及依据大小分别返回1。-1。0;当时将这种方法传到sort()函数中后为什么就能有升降序的不同结果呢?由于传进去的两个对象大小是不一致的,所以返回的值也是不一定的,所以我认为不会是依照返回值的结果的正负来推断升序还是降序,所以上网看了非常多解答。大家都描写叙述的不是非常清楚,都仅仅是提了如何就能升序,如何就能降序。可是没有说明为什么。是如何推断的?
后面我找到了关于Arrays中sort()函数的解说,它能够将数组中的所有或部分元素啊数字升序进行排序!!
。所以说当实现这两个接口后排序调用的sort()函数都是依照升序的方式来排的。故。上面的两个方法是为它推断两个元素的大小而存在的,sort()会依照升序排所有元素;
比如compareTo(),是对象内部的排序实现,它会依照对象的自然顺序来排列,当推断两个对象 的大小时,就会參考compareTo()的结果。大于0则觉得this.val大,反之。同理,调用comparetor比較器时。sort()传入compare(a,b)这两个參数,而返回值它则默认大于0就是a的属性值大于b的,反之;所以假设我们依照sort()推断两个对象的顺序来实现compareTo()和compare()方法时,就是升序的结果;而假设此事我们反着来,用o.val-this.val 或 b.val-a.val那么得到的值是与正确的两个值大小相反的,而sort()不知道依照自己觉得的以升序确定先后。小的在前。大的在后;那么实际情况就会变为大的在前,小的在后,这样结果就成了降序排列了~~~~