カスタムコンパレーターを使用してTreeSetから削除しないと、より大きな項目のセットが削除されないのはなぜですか?
Java 8とJava 11の両方を使用TreeSetして、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と、呼び出しは何も削除しません(これは後続の呼び出しではなく、上のスニペットの代わりに呼び出されます)。 languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP")); System.out.println(languages); // [c++, java, python] 何が悪いのですか?なぜこのように動作するのですか? 編集:String::compareToIgnoreCaseは有効なコンパレータです: (l, r) -> l.compareToIgnoreCase(r)