У меня есть приведенный ниже код, который создает 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);
}
}
К моему удивлению, вывод выше
[aa]
Хотя я ожидал
[aa, bb]
or
[bb, aa]
Часть «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);
Вывод теперь [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: "unix"
ОБНОВЛЕНИЕ
Вот соответствующий пост вместе с предложениями о том, как исправить проблему в будущей версии Java: https://yesday.github.io/blog/2018/java-gotchas-sorted-set-ignores-the-equals-method.html
Set
. Это гарантирует уникальность. Как вы думаете, почему это позволит дубликаты?! - person Boris the Spider   schedule 08.08.2018