Ответ
Для хранения уникальных элементов с автоматической сортировкой следует использовать TreeSet<E>.
Почему TreeSet?
- Реализует интерфейс
SortedSetиNavigableSet. - Гарантирует уникальность элементов (как и все
Set). - Автоматически поддерживает порядок сортировки при каждой вставке или удалении.
Способ сортировки:
- Естественный порядок (Natural Ordering): Элементы должны реализовывать интерфейс
Comparable. - Через Comparator: В конструктор можно передать объект
Comparatorдля кастомной логики сортировки.
Пример использования:
// 1. Сортировка по натуральному порядку (для Integer, String и т.д.)
SortedSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(5);
numbers.add(10); // Дубликат не добавится
numbers.add(2);
System.out.println(numbers); // Вывод: [2, 5, 10]
// 2. Сортировка с помощью Comparator (например, по убыванию)
SortedSet<Integer> descendingNumbers = new TreeSet<>(Comparator.reverseOrder());
descendingNumbers.addAll(numbers);
System.out.println(descendingNumbers); // Вывод: [10, 5, 2]
Характеристики и предостережения:
- Сложность операций:
add(),remove(),contains()работают за O(log n), так какTreeSetреализован на основе красно-черного дерева. nullзначения: Не допускаются при использовании натурального порядка. Могут быть разрешены только если переданныйComparatorявно обрабатываетnull.- Потокобезопасность: Не синхронизирован. Для использования в многопоточных сценариях требуется внешняя синхронизация:
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
Альтернатива: Если нужен порядок вставки, а не сортировки, но с уникальностью — используйте LinkedHashSet.