黑马程序员技术交流社区
标题:
Tree结构排序(从大到小&从小到大),实现Comparator接口的总结
[打印本页]
作者:
hieiyukina
时间:
2015-6-13 22:18
标题:
Tree结构排序(从大到小&从小到大),实现Comparator接口的总结
本帖最后由 hieiyukina 于 2015-6-13 22:21 编辑
Tree结构的
实现Comparator接口
重写public int compare(Object obj1, Object obj2)方法中
不同的顺序到底应该用谁减去谁呢?
规律:
obj1是最新要加入Tree结构的对象
obj2是已经在Tree结构里的对象
打印顺序是从负数左区,到根部,到正数右区
负数区在左边,也就是compare()方法中最后return 的值是负数
正数区在右边也就是compare()方法中最后return的值是正数
所以说如果想从小到大排
也就是负数区放比根部小的数,正数区放比根部大的数
那么就是要负数区的return都是负数
也就是说要传进来的obj1<obj2,
所以 最后是return obj1-obj2;///结果为负数,放到负数区
正数区的return都是正数,也就是说要传进来的obj1>obj2,
所以最后是return obj1-obj2;//结果为正数,放到正数区
简单的说
看你想把什么放负数区,什么放正数区
就想办法让负数区里的对象和根部的关系结果为负数就行
然后让正数区里的对象和根部的关系结果为正数就行
比如说从大到小排序
那么就是说
负数区里的数字都比根部大,那怎么能让负数区的对象关系和根部都为负呢?
根部-负数区数字<0
总归思想为
让先遍历出来的关系为小,为负数就可以
比如一个学生类
有得分Score
有年龄age
希望得分Score大的在前
则分数大在左
所以结果要return obj2.score-obj1.score
然后希望年龄小age的在前
则年龄小在左
所以结果要return obj1.age-obj2.age
可能还是有些绕
其实有个比较简单直观好理解的方法
就是把条件和返回值分开理解
比如还是前面说的
得分大的在前(左),年龄小的在前(左)
那就是
if(obj1.score>obj2.score)//新传进来的分数大于原有结构中的分数
{
return -1;//-1就代表负数,也就是往左边放
}
else if(obj1.score<obj2.score)//新传进来的分数小于原有结构中的分数
{
return 1;//1就是代表正数,也就往右边放
}
else //分数相同
{
if(obj1.age<obj2.age)//新传进来的年龄小于原有结构中的年龄
{
return -1;//-1就代表负数,也就是往左边放
}
else if(obj1.age>obj2.age)//新传进来的年龄大于原有结构中的年龄
{
return 1;//1就代表负数,也就是往右边放
}
}
复制代码
这样就不用思考到底谁去减谁是什么关系了
甚至后面不涉及到大小对比,而用其他对比,也可以这样设计了
作者:
候长亮
时间:
2015-6-13 22:21
顶起,抢沙发
作者:
冬日温暖
时间:
2015-6-13 22:52
{:2_36:}很好,支持哦
作者:
hieiyukina
时间:
2015-6-13 22:54
冬日温暖 发表于 2015-6-13 22:52
很好,支持哦
谢谢支持
作者:
小蒙
时间:
2015-6-13 23:29
赞一个!!!!!!!!!!!!
作者:
张清华
时间:
2015-6-13 23:59
顶一下~~~~~~~~~
作者:
xiaodong
时间:
2015-6-14 00:30
顶一下!!!
作者:
快乐Anne
时间:
2015-6-14 20:10
学习了,顶!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2