Використовуючи як 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)