小编Geo*_* F.的帖子

具有长度Comparator bug的Java TreeSet?

我有下面的代码,它使用基于字符串长度的比较器创建一个TreeSet.

public class TreeSetComparator {
    public static void main(String[] args) {
        SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length));
        sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
        System.out.println(sortedSet);
    }
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,上面的输出是

[aa]
Run Code Online (Sandbox Code Playgroud)

虽然我期待

[aa, bb]
Run Code Online (Sandbox Code Playgroud)

要么

[bb, aa]
Run Code Online (Sandbox Code Playgroud)

"bb"部分消失,这似乎与SortedSet合约相反.比较器应该只对元素进行排序而不是确定它们的唯一性,这通常由等于确定.

另一方面,如果我将比较器增强为总是为不等于下面的项目返回非零,那么我才能得到正确的结果.

    SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length).reversed().thenComparing(String::toString));
    sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
    System.out.println(sortedSet);
Run Code Online (Sandbox Code Playgroud)

现在的输出[aa, bb]正如我所料.

以上是TreeSet实现中的错误吗?

我的环境如下:

mvn --version                                                                                                                                            21:40:22
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T19:33:14+01:00)
Maven home: /home/aaaa/.sdkman/candidates/maven/current
Java version: 10.0.2, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-10-jdk
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.14.60-1-manjaro", arch: "amd64", family: …
Run Code Online (Sandbox Code Playgroud)

java comparator treeset

3
推荐指数
1
解决办法
196
查看次数

标签 统计

comparator ×1

java ×1

treeset ×1