具有比较器的树集构造函数<>参数

2022-09-01 18:12:14

Java 的类 TreeSet 的文档中,其中一个构造函数显示具有以下标头:

TreeSet(Comparator<? super E> c)

有人能帮助解释为什么有一个 TreeSet 的构造函数,它将比较器对象作为其参数吗?我不知道为什么要这样做。


答案 1

上述所有答案都是正确的,但我想补充一点,自定义比较器除了导致不同的排序外,还将以不同的方式过滤值。

由于 Set 的值是单声部的,因此如果自定义比较器返回两个值相同,则 Set 中只会显示其中一个值:

    Set<String> s = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.trim().compareTo(s2.trim());
        }
    });

    s.add("1");
    s.add(" 1");
    s.add("2 ");
    s.add("2");
    s.add(" 2 ");   

    Arrays.toString(s.toArray()); // [ "1", "2 "]

答案 2

树集中的元素保持排序。

如果使用没有比较器的构造函数,则元素类的自然排序(由 的实现定义)将用于对 TreeSet 的元素进行排序。Comparable

如果需要不同的排序,请在构造函数中提供比较器。


推荐