使用自定义比较器的TreeSet无法生成正确的结果

时间:2014-08-22 22:57:22

标签: java duplicates comparator treeset

我无法弄清楚可能是什么错误。这可能是一个愚蠢的。

问题:给定array String,删除重复项并提供按String的长度排序的TreeSet。

这是我的实施:

public class MyPrograms {

public static void main(String[] args){
        String[] arr = {"hello","world","a","b","cv","def","456","hello","world","b"};
        System.out.println(Arrays.toString(arr));
        sortStringbyLen(arr);
    }

public static void sortStringbyLen(String[] arr){


        Set<String> set = new TreeSet<String>(new Comparator<String>(){

            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o2.length(), o1.length());
            }
        });
        set.addAll(Arrays.asList(arr));
        System.out.println(set);
    }
}
}

输出结果为:

[hello, world, a, b, cv, def, 456, hello, world, b]
[hello, def, cv, a]

当我得到排序顺序正确时,我看到最后一组中缺少许多非重复元素(例如b, 456

2 个答案:

答案 0 :(得分:2)

要获得正确的行为,您需要比较器输出与equals方法一致。当两个字符串具有相同的长度时,比较器的输出为0,因此您只保留每个不同长度的一个元素。要修复它,你应该打破比较器中的联系,也许是这样:

    new Comparator<String>(){

        @Override
        public int compare(String o1, String o2) {
            int cmp = Integer.compare(o2.length(), o1.length());
            return cmp != 0 ? cmp : o1.compareTo(o2);
        }
    }

答案 1 :(得分:1)

TreeMap认为所有与0比较的元素相等(这实际上违反了Map接口的约定)。因此,比较器的任何相同长度Strings将返回0并被删除。您需要添加一个条件,如果字符串的长度相同,则应调用String的compareTo方法。