黑马程序员技术交流社区

标题: 比较器的理解 [打印本页]

作者: 曹昌豪    时间: 2012-5-22 19:08
标题: 比较器的理解
童鞋们都知道的,comparable和comparator接口,是比较器。
前者的compareTo是按照自然排序的方法,不需要覆写,但是当我们仍然要覆写它,覆写以后为什么还是叫做自然排序方法。
而后者中的compare方法怎被称为自定义排序方法。
要怎么解释才好,光会用不行啊,还得能说出来才好
作者: 张晨    时间: 2012-5-22 19:11
理解不对,两个本质上是一样的
comparable 是写在需要比较的类的里面的
comparator 独立于需要比较的类
其他都是一样的,里面都可以实现自然排序和自定义排序
作者: 曹昌豪    时间: 2012-5-22 19:17
comparable是在类里面定义的方法是吧,comparator是一个类,要把对象传入到要比较的类里面去的啊!!唉,说不好,
作者: 云惟桉    时间: 2012-5-22 19:20
关于Comparable:
  1. public interface Comparable<T>
  2. 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
复制代码
关于Comparator:
  1. public interface Comparator<T>
  2. 强行对某个对象 collection 进行整体排序 的比较函数。
复制代码
定义上就不同,Comparable是直接从本质上改变元素的比较性,让一个类的对象的比较方法在原则上被定义。因此称作自然排序。
Comparator是我们自定义的排序方法,并封装成一个单独的类,作为参数传递给需要排序的列表或数组。
操作方法的不同,也就造成了概念的不同。
不知道这么说楼主是否理解了。
作者: 曹昌豪    时间: 2012-5-22 19:25
好像理解了点,那个Comparator封装成一个单独的类可以理解,前面那个哥们说的太抽象了,再直接点....
作者: 魏涞    时间: 2012-5-22 19:25
嗯,LZ问的重写compareTo为什么还叫自然顺序的问题,是在我们进行比较时,两种不同的使用方式而言的,一个类实现了comparable,在进行比较的时候,不需要再指定比较器,如:TreeSet<Integer> set = new TreeSet<Integer>(); 用实现comparator接口的方法,我们在比较的时候,需要指定比较器,如:TreeSet<Integer> set = new TreeSet<Integer>(new IntegerComparator());
作者: 余宏    时间: 2012-5-22 19:25
Comparable 是一个自身已经支持自比较的接口
Comparator 是一个比较器 ,当对象本身 不支持自排序和自比较函数的时候 ,我们可以通过实现Compartor 来比较两对象的大小
Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能 ,而 Comparator 可以看作一种算法 一种设计模式 ,
Comparable 相对比较固定, Comparator 比较灵活 ,可以与任何需要实现功能的类 绑定 ,Comparable 是 静态绑定
Comparator 是动态绑定

作者: 曹昌豪    时间: 2012-5-22 19:30
恩恩,可以了,多谢同学不吝赐教,论坛提问真挺好啊,





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2