Мне нужен пример о том, как использовать сопоставимый класс на a HashSet
получить порядок по возрастанию. Скажем, у меня есть a HashSet
как этот:
HashSet<String> hs = new HashSet<String>();
Как я могу добраться hs
быть в порядке возрастания?
Вместо этого используйте 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().
HashSet
"не дает никаких гарантий относительно порядка итерации набора". Use LinkedHashSet
instead.
Дополнение: Я бы поддержал замечание @BalusC о реализации Comparable
и выразил бы
небольшое предпочтение LinkedHashSet
, который предлагает "предсказуемый порядок итераций ... без увеличения затрат, связанных с TreeSet
."
Добавление: @Stephen поднимает важный вопрос, который говорит в пользу предложения @BalusC о TreeMap
. LinkedHashSet
является более эффективной альтернативой, только если данные (почти) статичны и уже отсортированы.
HashSets не гарантирует порядок итераций :
Этот класс реализует Set интерфейс, поддерживаемый хеш-таблицей (на самом деле экземпляр HashMap). Это не дает никаких гарантий относительно порядок итераций набора; в в частности, это не гарантирует, что порядок останется постоянным в течение время. Этот класс допускает нулевое значение элемент.
Вам, вероятно, потребуется выбрать другую структуру данных , если вы хотите иметь возможность управлять порядком итераций (или иметь его вообще!)