黑马程序员技术交流社区

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

作者: 唐长智    时间: 2013-3-2 00:45
标题: 比较器的问题
看了集合的视频,在TreeSet集合中。元素如果实现了Comparble接口,并且覆写了compareTo()方法,就能添加到集合中,当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数,这样在添加对象时,就能自动进行比较。

问题是,为什么当两种排序都存在时,以集合构造函数中传入的比较器为主,原理是什么呢?
作者: 夏振博    时间: 2013-3-2 01:09
源码里能得到答案
作者: 张世钦    时间: 2013-3-2 01:20
举个例子: 你去买火车票,你不给卖票的说要什么铺位的话,他就默认给你打一张票,选着哪个是哪个
你要是指定了要下铺,那他就按你给他说的打票

也就是说   你不指定,按默认的来   你指定了  就按你指定的来

实在想研究的话,去看看源代码,
作者: lzw123451    时间: 2013-3-2 02:22
对,要看内码原理。

if(有Comparator)
   用Comparator;
else if(元素实现了comparable接口)
   用compareTo方法
elseif(元素本身可比较)
   自然排序
ellse
   按集合默认存放

这有个从高到低的等级   
作者: vmvm555    时间: 2013-3-11 14:23
楼主问这个问题是想么末倒置吗,通过使容器具有比较性就是为了弥补元素具有比较性的不足,如果一个元素对象,你无法拿到对应的类的源代码,从而修改其源码,甚至你想自己写一个类来继承他然后覆写里面的compareTo()方法都不可能,当该类被final修饰时,这个类就是最终类,像String,此时你只有考虑使用容器的比较性了,所以说容器的比较性相对于元素自身的比较性更加优先考虑
作者: 谢洋    时间: 2013-3-11 14:56
如果自然比较都能满足了要求,那你何必再把比较器传进入?
如果自然比较都不满足了要求,你把比较出传进去,却还是用自身比较方法,那这又是做什么?不觉得这样好疯狂?
作者: 谢洋    时间: 2013-3-11 15:05
李志卫 发表于 2013-3-2 02:22
对,要看内码原理。

if(有Comparator)

对,要看内码原理。

if(有Comparator)
   用Comparator;
else if(元素实现了comparable接口)//实现了comparable也就是说元素本身可比较了
   用compareTo方法
elseif(元素本身可比较)//与上面重复了
   自然排序
ellse
   按集合默认存放

这有个从高到低的等级   

另外补充:String 及Integer本身已经实现comparable,这点可以看API,int 型能排序,是因为被自动装箱成Integer型再操作

作者: 猫腻    时间: 2013-3-13 10:10
如果仍有问题,可以继续追问;若没有问题了,请及时将帖子分类改成【已解决】~

http://bbs.itheima.com/thread-37643-1-1.html





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