упорядочить пример с хэш-сетом? - PullRequest
20 голосов
/ 01 августа 2010

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

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

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

Ответы [ 3 ]

45 голосов
/ 01 августа 2010

Используйте взамен 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 и их порядок заказа по умолчанию уже соответствует желаемому, то вам, по сути, не нужно указывать Comparator. Затем вы можете построить 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().

Смотри также:

8 голосов
/ 01 августа 2010

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

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

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

1 голос
/ 01 августа 2010

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

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

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

...