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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

hieiyukina

中级黑马

  • 黑马币:11

  • 帖子:72

  • 精华:0

本帖最后由 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

可能还是有些绕
其实有个比较简单直观好理解的方法
就是把条件和返回值分开理解

比如还是前面说的
得分大的在前(左),年龄小的在前(左)
那就是

  1. if(obj1.score>obj2.score)//新传进来的分数大于原有结构中的分数
  2. {
  3.         return -1;//-1就代表负数,也就是往左边放
  4. }
  5. else if(obj1.score<obj2.score)//新传进来的分数小于原有结构中的分数
  6. {
  7.         return 1;//1就是代表正数,也就往右边放
  8. }
  9. else        //分数相同
  10. {
  11.         if(obj1.age<obj2.age)//新传进来的年龄小于原有结构中的年龄
  12.         {
  13.                 return -1;//-1就代表负数,也就是往左边放
  14.         }
  15.         else if(obj1.age>obj2.age)//新传进来的年龄大于原有结构中的年龄
  16.         {
  17.                 return 1;//1就代表负数,也就是往右边放
  18.         }
  19. }
复制代码



这样就不用思考到底谁去减谁是什么关系了
甚至后面不涉及到大小对比,而用其他对比,也可以这样设计了

7 个回复

倒序浏览
候长亮 来自手机 中级黑马 2015-6-13 22:21:15
沙发
顶起,抢沙发
回复 使用道具 举报
{:2_36:}很好,支持哦
回复 使用道具 举报

谢谢支持
回复 使用道具 举报
赞一个!!!!!!!!!!!!
回复 使用道具 举报
顶一下~~~~~~~~~
回复 使用道具 举报
顶一下!!!
回复 使用道具 举报
学习了,顶!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马