A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在TreeSet的自定义比较器Comparator中,如果把比较规则定义为返回两个元素相减的值,通过程序验证发现如果值为正数,则TreeSet中元素会按升序排列,如果值为负数,则按降序排列。我想了解一下这个过程的原理是如何实现的?TreeSet的红黑树又该怎么理解?谢谢
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端

5 个回复

倒序浏览
因为有默认排序,本来就是从小到大,返回正数的时候,他就认为后传的是大的,所有就会造成你说的倒序
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
class1 发表于 2016-10-24 20:57
因为有默认排序,本来就是从小到大,返回正数的时候,他就认为后传的是大的,所有就会造成你说的倒序
...

好吧,作为初学者太底层的东西还是不用太过追究了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
shizhen5452 发表于 2016-10-24 21:29
好吧,作为初学者太底层的东西还是不用太过追究了

我也是初学,一起探讨!
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
我的理解是这样的:
回复 使用道具 举报
我的理解是这样的:

你可以把每一个元素想象成一个由三部分组成的整体
第一部分,存放着比跟元素小的元素的索引
中间部分,存放着两个动作,一个是判断,一个是赋值.因为在判断为0的时候,就会覆盖内容
第三部分,存放着比它大的数的索引

当然,实际上不是链表,不过类似于优化版的链表

在遍历的时候,从左往右遍历,完成一个元素的遍历,才能在遍历右边的一个,就保证了逻辑的严密性.

-------------------------------------------------
而比较器你也看到了,compareto()方法是双参,
第一个参是要添加的,第二个参是根元素

在比较器的方法体中,参1减参2,和参2减参1,不过是改变判断结果,实现逻辑还是不变的.

----------------------------------------------
昨天发现一个特别有趣的
就是TreeMap集合
我们玩了一下TreeMap的集合嵌套
大集合的键是小TreeMap集合

现象时,你要不写比较器
编写不标红

但是运行期报类型转换异常,

如果写了比较器,比如都返回1

在便利的时候,会将全部键遍历,但是对应的值全是null

纠结了好久

是因为键在map集合中,遍历了所有的值,不知道该用哪一个了.于是直接不选了,傲娇的反悔了null.

我当时就醉了.

我以为java是汉子
没想到这丫是个姑娘.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马