Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t使用自定义比较器从树集合中移除是否移除更大的项目集? 使用java 8和java 11,用一个比较器考虑以下内容: final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); languages.add("python"); System.out.println(languages); // [c++, java, python] (l, r) -> l.compareToIgnoreCase(r)_Java_Java 8_Comparator_Java 11_Treeset - Fatal编程技术网

为什么';t使用自定义比较器从树集合中移除是否移除更大的项目集? 使用java 8和java 11,用一个比较器考虑以下内容: final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); languages.add("python"); System.out.println(languages); // [c++, java, python] (l, r) -> l.compareToIgnoreCase(r)

为什么';t使用自定义比较器从树集合中移除是否移除更大的项目集? 使用java 8和java 11,用一个比较器考虑以下内容: final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); languages.add("python"); System.out.println(languages); // [c++, java, python] (l, r) -> l.compareToIgnoreCase(r),java,java-8,comparator,java-11,treeset,Java,Java 8,Comparator,Java 11,Treeset,但是,如果我尝试删除的多于中存在的,则调用根本不会删除任何内容(这不是后续调用,而是调用的,而不是上面的代码段): 我做错了什么?为什么会这样 编辑:String::compareToIgnoreCase是有效的比较器: final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); language

但是,如果我尝试删除的多于中存在的,则调用根本不会删除任何内容(这不是后续调用,而是调用的,而不是上面的代码段):

我做错了什么?为什么会这样

编辑:
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]
(l, r) -> l.compareToIgnoreCase(r)
以下是javadoc:

此实现通过调用每个集合上的size方法来确定此集合和指定集合中较小的集合。如果此集合的元素较少,则实现将迭代此集合,依次检查迭代器返回的每个元素,以查看它是否包含在指定的集合中。如果它是这样包含的,则使用迭代器的remove方法将其从该集中移除。如果指定的集合具有较少的元素,那么实现将迭代指定的集合,使用该集合的remove方法从该集合中移除迭代器返回的每个元素

在第二个实验中,您使用的是javadoc的第一个案例。因此,它迭代“java”、“c++”等,并检查它们是否包含在
Set.of(“PYTHON”、“c++”)返回的集合中。它们没有,所以它们没有被移除。
使用另一个树集,使用与参数相同的比较器,它应该可以正常工作。
使用两种不同的集合实现,一种使用
equals()
,另一种使用比较器,确实是一件危险的事情


请注意,关于这一点,出现了一个错误:。

您的意思是,当两个集合具有相同的特征时,它会起作用吗<代码>最终集子语言=新树集(字符串::compareToIgnoreCase)
子语言.addAll(Arrays.asList(“PYTHON”、“C++”、“LISP”))
语言。删除所有(子语言)您遇到了javadoc描述的“如果此集合的元素较少”的情况。另一种情况是“如果指定的集合具有较少的元素”。这个答案是正确的,但这是非常不直观的行为。这感觉像是
TreeSet
设计中的一个缺陷。我同意,但我对此无能为力。这两者都是:这是一个非常不直观的行为,有正确的文档记录,但是,由于不直观和欺骗性,它也是一个设计缺陷,有一天可能会被修复。相关缺陷条目:(TreeSet移除所有与字符串不一致的行为。不区分大小写\u顺序)密切相关。相关: