为什么不使用自定义比较器从TreeSet中删除较大的项集?

问题描述 投票:21回答:1

同时使用Java 8和Java 11,将下面的TreeSetTreeSet比较器一起考虑:

String::compareToIgnoreCase

[当我尝试删除String::compareToIgnoreCase中存在的确切元素时,它起作用:删除所有指定的元素:

final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");

System.out.println(languages);                 // [c++, java, python]

但是,如果我尝试删除的内容比TreeSet中的内容多[,则该调用根本不会删除任何内容(这不是后续调用,而是代替了上面的代码段):] >languages.removeAll(Arrays.asList("PYTHON", "C++")); System.out.println(languages); // [java]

我在做什么错?为什么会这样表现?

编辑:TreeSet是有效的比较器:

TreeSet

同时使用Java 8和Java 11,请考虑以下具有String :: compareToIgnoreCase比较器的TreeSet:final Set 

语言=新的TreeSet <>(String :: compareToIgnoreCase); ...

java java-8 comparator java-11 treeset
1个回答
20
投票
这里是languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP")); System.out.println(languages); // [c++, java, python] 的Javadoc:

此实现通过调用各自的size方法来确定此集合和指定集合中的较小者。如果此集合具有较少的元素,则实现将对此集合进行迭代,依次检查迭代器返回的每个元素,以查看其是否包含在指定的集合中。如果包含此类内容,则使用迭代器的remove方法将其从此集中删除。如果指定的集合具有较少的元素,则实现将迭代指定的集合,并使用此集合的remove方法从此集合中删除迭代器返回的每个元素。
© www.soinside.com 2019 - 2024. All rights reserved.