Подтвердить что ты не робот

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

Мне нужен пример того, как использовать сопоставимый класс на HashSet, чтобы получить восходящий порядок. Допустим, у меня есть HashSet, как этот:

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

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

4b9b3361

Ответ 1

Используйте TreeSet. Он имеет конструктор с Comparator. Он автоматически сортирует Set.

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

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

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

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

См. также:

Ответ 2

HashSet "не дает никаких гарантий относительно порядка итерации набора". Вместо этого используйте LinkedHashSet.

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

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

Ответ 3

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

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

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