黑马程序员技术交流社区
标题:
比较器的问题
[打印本页]
作者:
唐长智
时间:
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