本帖最后由 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就代表负数,也就是往右边放
- }
- }
复制代码
这样就不用思考到底谁去减谁是什么关系了
甚至后面不涉及到大小对比,而用其他对比,也可以这样设计了
|
|