黑马程序员技术交流社区

标题: TreeSet的比较器 [打印本页]

作者: life55    时间: 2016-2-6 01:21
标题: TreeSet的比较器
//需求:将字符串按照长度排序
        public static void main(String[] args) {
                TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {

                        @Override
                        public int compare(String s1, String s2) {        //按照字符串的长度比较
                                int length = s1.length() - s2.length();
                                return length == 0 ? s1.compareTo(s2) : length;
                        }
                });
                ts.add("aaa");
                ts.add("aa");
                ts.add("b");
                ts.add("bbbbb");
                ts.add("bb");
                System.out.println(ts);
        }
上面的 int length = s1.length() - s2.length(); 为什么这样是按顺序排序? s1和s2反过来就变成了倒序了?  麻烦回答的详细点,谢谢!


作者: 宋达思    时间: 2016-2-6 09:34

明白了吧,你把两个对象的顺序换了当然上面的减法的结果也就变了,除非s1和s2的length相等。
作者: life55    时间: 2016-2-6 09:54
宋达思 发表于 2016-2-6 09:34
明白了吧,你把两个对象的顺序换了当然上面的减法的结果也就变了,除非s1和s2的length相等。 ...

我看了这个API,我主要问的不是这个. 我是想问, 为什么顺序排序(从小到大)一定要前面减后面的参数?  
作者: life55    时间: 2016-2-6 09:56
补充一点,我主要想问为什么顺序排序(从小到大)一定要前面减后面的参数?  比较器的原理也是一个一个比较,它怎么知道第一个参数就比第二个大呢?
作者: 宋达思    时间: 2016-2-6 10:17
我也忘得差不多了,不一定对啊,首先不用纠结谁减谁,这个只不过是写习惯了吧,你反着减也没事,主要还是看结果是0还是正整数或负整数。你用的是TreeSet,那么二叉树原理应该知道吧,不管你用的是Comparable还是Comparator都一样。

作者: tujiu888    时间: 2016-2-6 18:34
我也是有点不理解
作者: life55    时间: 2016-2-6 19:37
tujiu888 发表于 2016-2-6 18:34
我也是有点不理解

等大神解答




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