黑马程序员技术交流社区

标题: TreeSet通过重写比较器中方法排序 [打印本页]

作者: 王一勇    时间: 2014-7-16 00:34
标题: TreeSet通过重写比较器中方法排序
本帖最后由 王一勇 于 2014-7-16 00:41 编辑

                如下代码:通过匿名内部类的方式重写了compare方法,想问的是为什么在Comare中定义了一个int num,对num作减运算                                     并返回num就能对集合排序了?还在神乎中.......求解。
                       TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
                        @Override
                        public int compare(Student s1, Student s2) {
                                int num = s2.getSum() - s1.getSum();//s1中数学,语文,英语成绩之和高的排前面
                                int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;//若三项成绩和相等,语文成绩高的排前面
                                int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;//若语文成绩还相同,再比较数学成绩高的排前面
                                return num3;
                        }
                });

作者: wisely    时间: 2014-7-16 00:39
:funk:

楼主的这个例子太强悍了,不易理解。建议看一下毕老师的视频,具体的是第15天04、05这两个,讲解的非常清楚。
作者: fantacyleo    时间: 2014-7-16 00:55
为什么能排序,跟你怎么实现Comparator接口无关。之所以能排序,是因为TreeSet在存入元素的时候,会按照二叉树的排序规则,将你要存入的元素和已存在的元素进行比较,而比较结果所依据的就是你传入的实现了Comparator接口的匿名对象的compare方法。

具体的二叉树排序规则,老毕的视频里其实也没讲完整,但初学者就不要深究了,把视频里讲的掌握即可
作者: 于龙超123    时间: 2014-7-22 00:11
有点深奥!
作者: w306752855    时间: 2014-7-22 00:29
学习一下
作者: cheye0207    时间: 2014-7-22 02:42
个人感觉返回值错了。。。
作者: 渠嘉树    时间: 2014-7-22 02:56
好复杂.....
作者: 744919632    时间: 2015-11-24 00:21
自定义的的比较器是那么写的,就是这么一回事。不必深究。还有2楼的哥们说的对,我就不重复了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2