упорядочивание hashset примера?

Мне нужен пример о том, как использовать сопоставимый класс на a HashSet получить порядок по возрастанию. Скажем, у меня есть a HashSet как этот:

HashSet<String> hs = new HashSet<String>();

Как я могу добраться hs быть в порядке возрастания?

20
задан Joshua 3 February 2019 в 20:47
поделиться

3 ответа

Вместо этого используйте TreeSet . У него есть конструктор , принимающий Comparator . Он автоматически отсортирует набор Set .

Если вы хотите преобразовать HashSet в TreeSet , то сделайте это:

Set<YourObject> hashSet = getItSomehow();
Set<YourObject> treeSet = new TreeSet<YourObject>(new YourComparator());
treeSet.addAll(hashSet);
// Now it's sorted based on the logic as implemented in YourComparator.

Если элементы, которые у вас есть, уже реализуют Comparable и его порядок упорядочивания по умолчанию - это уже то, что вам нужно, то вам в принципе не нужно поставлять Компаратор . Затем вы можете построить TreeSet непосредственно на основе HashSet . Например.

Set<String> hashSet = getItSomehow();
Set<String> treeSet = new TreeSet<String>(hashSet);
// Now it's sorted based on the logic as implemented in String#compareTo().

См. Также:

45
ответ дан 29 November 2019 в 23:06
поделиться

HashSet "не дает никаких гарантий относительно порядка итерации набора". Use LinkedHashSet instead.

Дополнение: Я бы поддержал замечание @BalusC о реализации Comparable и выразил бы небольшое предпочтение LinkedHashSet, который предлагает "предсказуемый порядок итераций ... без увеличения затрат, связанных с TreeSet."

Добавление: @Stephen поднимает важный вопрос, который говорит в пользу предложения @BalusC о TreeMap. LinkedHashSet является более эффективной альтернативой, только если данные (почти) статичны и уже отсортированы.

8
ответ дан 29 November 2019 в 23:06
поделиться

HashSets не гарантирует порядок итераций :

Этот класс реализует Set интерфейс, поддерживаемый хеш-таблицей (на самом деле экземпляр HashMap). Это не дает никаких гарантий относительно порядок итераций набора; в в частности, это не гарантирует, что порядок останется постоянным в течение время. Этот класс допускает нулевое значение элемент.

Вам, вероятно, потребуется выбрать другую структуру данных , если вы хотите иметь возможность управлять порядком итераций (или иметь его вообще!)

1
ответ дан 29 November 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: