Вы не можете, поскольку у a Setнет методов произвольного доступа (то .get()есть элемента по заданному индексу), что в основном требуется для алгоритмов сортировки;)
fge
3
Вы можете сначала преобразовать его в список, а затем отсортировать, если вам нужно отсортировать
demongolem
Вы не можете этого сделать, поскольку у a HashSetнет определенного порядка. Ваш вопрос воплощает противоречие в терминах.
Простое размещение элементов не даст гибкости сортировки в любом порядке с любым элементом внутри него. Вышеупомянутое решение делает.
Джесс
16
Способ сортировки Java 8:
fooHashSet.stream().sorted(Comparator.comparing(Foo::getSize))//comparator - how you want to sort it.collect(Collectors.toList());//collector - what you want to collect it to
*Foo::getSize это пример того, как естественным образом отсортировать HashSet объекта YourItem по размеру.
* Collectors.toList()собирается собрать результат сортировки в список, который вам нужно будет захватить с помощьюList<Foo> sortedListOfFoo =
Не могли бы вы добавить логику для сортировки в определенном порядке?
Джесс
@Jess, я не знаю, какой у вас конкретный порядок, Джесс, вы можете отсортировать его по своему усмотрению с помощью компаратора.
LazerBanana
Я имел в виду, как определить восходящий или нисходящий
Джесс
14
Использовать java.util.TreeSet как фактический объект. Когда вы перебираете эту коллекцию, значения возвращаются в четко определенном порядке.
Если вы используете, java.util.HashSetто порядок зависит от внутренней хэш-функции, которая почти наверняка не является лексикографической (в зависимости от содержимого).
Почему вы предполагаете, что они хранят Stringценности?
Сотириос Делиманолис
Я не думаю, что, возможно, я использую лексографию неточно ;-)
P45 Imminent
3
Это очень неправильно. Он не хранит ключи в лексографическом (sp?) Порядке. Он либо использует их естественный порядок (который зависит от Comparableинтерфейса, который реализуют ключи), либо использует предоставленный Comparator.
Сотириос Делиманолис
Я редактировал. Как думаешь лучше, или надо удалить ответ?
P45 Imminent
1
Если вы переместите HashSetв TreeSet, ваш класс должен реализовать Comparableинтерфейс или предоставить пользовательский Comparator. В противном случае, поскольку вы не можете отсортировать a HashSet, просто преобразуйте его в Listи отсортируйте.
Элементы в HashSet нельзя отсортировать. Всякий раз, когда вы помещаете элементы в HashSet, это может испортить порядок всего набора. Он специально разработан для повышения производительности. Когда вам не важен порядок, HashSet будет наиболее эффективным набором для быстрой вставки и поиска.
TreeSet будет автоматически сортировать все элементы каждый раз, когда вы вставляете элемент.
Возможно, вы пытаетесь отсортировать только один раз. В этом случае TreeSet - не лучший вариант, потому что он должен все время определять размещение вновь добавленных элементов.
Наиболее эффективное решение - использовать ArrayList. Создайте новый список и добавьте все элементы, затем отсортируйте его один раз. Если вы хотите сохранить только уникальные элементы (удалите все дубликаты, как это делает set, затем поместите список в LinkedHashSet, он сохранит порядок, который вы уже отсортировали)
List<Integer> list =newArrayList<>();
list.add(6);
list.add(4);
list.add(4);
list.add(5);Collections.sort(list);Set<Integer> unique =newLinkedHashSet<>(list);// 4 5 6// The above line is not copying the objects! It only copies references.
Теперь у вас есть отсортированный набор, если вы хотите, чтобы он был в форме списка, а затем конвертируйте его в список.
По моему скромному мнению, ответ LazerBanana должен быть самым рейтинговым и принятым, потому что все остальные ответы, указывающие на java.util.TreeSet(или сначала преобразованные в список, а затем вызов Collections.sort(...)преобразованного списка), не удосужились спросить OP, какие объекты у вас HashSetесть, т.е. если эти элементы имеют предопределенный естественный порядок или нет, и это не дополнительный вопрос, а обязательный вопрос.
Вы просто не можете войти и начать помещать свои HashSetэлементы в TreeSetтип элемента, если он еще не реализует Comparableинтерфейс или если вы явно не переходите Comparatorк TreeSetконструктору.
Из TreeSetJavaDoc,
Создает новый пустой набор деревьев, отсортированный в соответствии с естественным порядком его элементов. Все элементы, вставленные в набор, должны реализовывать интерфейс Comparable. Кроме того, все такие элементы должны быть взаимно сопоставимы: e1.compareTo (e2) не должен вызывать исключение ClassCastException для любых элементов e1 и e2 в наборе. Если пользователь пытается добавить элемент в набор, который нарушает это ограничение (например, пользователь пытается добавить строковый элемент в набор, элементы которого являются целыми числами), вызов add вызовет исключение ClassCastException.
Вот почему только все ответы на основе потока Java8 - где вы определяете свой компаратор на месте - имеют смысл только потому, что реализация сопоставимого в POJO становится необязательной. Программист определяет компаратор по мере необходимости. Попытка собрать, TreeSetне задав этот фундаментальный вопрос, также неверна (ответ ниндзя). Предполагая , что типы объектов быть Stringили Integerтакже неправильно.
Сказав это, другие проблемы, такие как
Производительность сортировки
Memory Foot Print (сохранение исходного набора и создание новых отсортированных наборов каждый раз, когда выполняется сортировка или вы хотите отсортировать набор на месте и т. Д.)
должны быть и другие соответствующие моменты. Просто указывать на API не должно быть единственным намерением.
Поскольку исходный набор уже содержит только уникальные элементы, и это ограничение также поддерживается отсортированным набором, поэтому исходный набор должен быть очищен из памяти, поскольку данные дублируются.
1.Add all set element in list -> al.addAll(s);2.Sort all the elements in list using ->Collections.sort(al);publicclassSortSetProblem{publicstaticvoid main(String[] args){ArrayList<String> al =newArrayList();Set<String> s =newHashSet<>();
s.add("ved");
s.add("prakash");
s.add("sharma");
s.add("apple");
s.add("ved");
s.add("banana");System.out.println("Before Sorting");for(String s1 : s){System.out.print(" "+ s1);}System.out.println("After Sorting");
al.addAll(s);Collections.sort(al);for(String set : al){System.out.print(" "+ set);}}}
Мы не можем решить, что элементы HashSet будут сортироваться автоматически. Но мы можем отсортировать их, преобразовав в TreeSet или любой список, например ArrayList или LinkedList и т. Д.
// Create a TreeSet object of class ETreeSet<E> ts =newTreeSet<E>();// Convert your HashSet into TreeSet
ts.addAll(yourHashSet);System.out.println(ts.toString()+"\t Sorted Automatically");
Я использовал это в операторе печати, поэтому, если вам действительно нужно сохранить порядок, вам может потребоваться использовать TreeSets или другие структуры, предложенные в этом потоке.
HashSet
- неупорядоченная коллекция.Set
нет методов произвольного доступа (то.get()
есть элемента по заданному индексу), что в основном требуется для алгоритмов сортировки;)HashSet
нет определенного порядка. Ваш вопрос воплощает противоречие в терминах.Ответы:
HashSet не гарантирует какой-либо порядок его элементов. Если вам нужна эта гарантия, подумайте об использовании TreeSet для хранения ваших элементов.
Однако, если вам просто нужно отсортировать элементы для этого одного вхождения, просто временно создайте список и отсортируйте его:
источник
List<String> sortedList = new ArrayList<String>(yourHashSet);
Добавьте все свои объекты в файл
TreeSet
, вы получите отсортированный Set. Ниже приведен необработанный пример.источник
TreeSet myTreeSet = new TreeSet(myHashSet);
вы можете избежать повторного добавления всех элементов в Treeset.Вместо этого вы можете использовать TreeSet .
источник
Способ сортировки Java 8:
*
Foo::getSize
это пример того, как естественным образом отсортировать HashSet объекта YourItem по размеру.*
Collectors.toList()
собирается собрать результат сортировки в список, который вам нужно будет захватить с помощьюList<Foo> sortedListOfFoo =
источник
Использовать
java.util.TreeSet
как фактический объект. Когда вы перебираете эту коллекцию, значения возвращаются в четко определенном порядке.Если вы используете,
java.util.HashSet
то порядок зависит от внутренней хэш-функции, которая почти наверняка не является лексикографической (в зависимости от содержимого).источник
String
ценности?Comparable
интерфейса, который реализуют ключи), либо использует предоставленныйComparator
.HashSet
вTreeSet
, ваш класс должен реализоватьComparable
интерфейс или предоставить пользовательскийComparator
. В противном случае, поскольку вы не можете отсортировать aHashSet
, просто преобразуйте его вList
и отсортируйте.Вы можете использовать сборщики Java 8 и TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))
источник
new TreeSet<>(hashSet)
является более кратким и, вероятно, более эффективным.Вы можете использовать TreeSet, как упоминалось в других ответах.
Вот еще немного подробностей о том, как его использовать:
Вывод:
источник
Элементы в HashSet нельзя отсортировать. Всякий раз, когда вы помещаете элементы в HashSet, это может испортить порядок всего набора. Он специально разработан для повышения производительности. Когда вам не важен порядок, HashSet будет наиболее эффективным набором для быстрой вставки и поиска.
TreeSet будет автоматически сортировать все элементы каждый раз, когда вы вставляете элемент.
Возможно, вы пытаетесь отсортировать только один раз. В этом случае TreeSet - не лучший вариант, потому что он должен все время определять размещение вновь добавленных элементов.
Наиболее эффективное решение - использовать ArrayList. Создайте новый список и добавьте все элементы, затем отсортируйте его один раз. Если вы хотите сохранить только уникальные элементы (удалите все дубликаты, как это делает set, затем поместите список в LinkedHashSet, он сохранит порядок, который вы уже отсортировали)
Теперь у вас есть отсортированный набор, если вы хотите, чтобы он был в форме списка, а затем конвертируйте его в список.
источник
Основываясь на ответе @LazerBanana, я приведу свой собственный пример набора, отсортированного по идентификатору объекта:
источник
На всякий случай, если вы не хотите использовать,
TreeSet
вы можете попробовать это.источник
По моему скромному мнению, ответ LazerBanana должен быть самым рейтинговым и принятым, потому что все остальные ответы, указывающие на
java.util.TreeSet
(или сначала преобразованные в список, а затем вызовCollections.sort(...)
преобразованного списка), не удосужились спросить OP, какие объекты у васHashSet
есть, т.е. если эти элементы имеют предопределенный естественный порядок или нет, и это не дополнительный вопрос, а обязательный вопрос.Вы просто не можете войти и начать помещать свои
HashSet
элементы вTreeSet
тип элемента, если он еще не реализуетComparable
интерфейс или если вы явно не переходитеComparator
кTreeSet
конструктору.Из
TreeSet
JavaDoc,Вот почему только все ответы на основе потока Java8 - где вы определяете свой компаратор на месте - имеют смысл только потому, что реализация сопоставимого в POJO становится необязательной. Программист определяет компаратор по мере необходимости. Попытка собрать,
TreeSet
не задав этот фундаментальный вопрос, также неверна (ответ ниндзя). Предполагая , что типы объектов бытьString
илиInteger
также неправильно.Сказав это, другие проблемы, такие как
должны быть и другие соответствующие моменты. Просто указывать на API не должно быть единственным намерением.
Поскольку исходный набор уже содержит только уникальные элементы, и это ограничение также поддерживается отсортированным набором, поэтому исходный набор должен быть очищен из памяти, поскольку данные дублируются.
источник
источник
Если вы хотите, чтобы конец
Collection
был в форме,Set
и если вы хотите определить свою собственную,natural order
а не форму ,TreeSet
то -1. Преобразуйте
HashSet
вList
2. Произвольная сортировка
List
использованияComparator
3. Преобразуйте обратно
List
вLinkedHashSet
для поддержания порядка4. Отобразите
LinkedHashSet
Пример программы -
Вывод -
Здесь коллекция отсортирована как -
Первый - По убыванию
String
длиныВторой - По убыванию
String
алфавитной иерархииисточник
вы можете сделать это следующими способами:
Способ 1:
Способ 2:
Метод 2 более предпочтителен, потому что другой метод требует много времени для передачи данных между хэш-набором и списком.
источник
Мы не можем решить, что элементы HashSet будут сортироваться автоматически. Но мы можем отсортировать их, преобразовав в TreeSet или любой список, например ArrayList или LinkedList и т. Д.
источник
Вы можете использовать библиотеку guava для того же
источник
SortedSet был добавлен с java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
источник
Вы можете обернуть его в TreeSet следующим образом:
вывод:
mySet items [1, 3, 4, 5]
treeSet items [1, 3, 4, 5]
вывод:
mySet items [шесть, четыре, пять, два, эльф]
treeSet items [эльф, пять, четыре, шесть, два]
Требование для этого метода состоит в том, что объекты набора / списка должны быть сопоставимы (реализовать интерфейс Comparable)
источник
Эта простая команда помогла мне:
Я использовал это в операторе печати, поэтому, если вам действительно нужно сохранить порядок, вам может потребоваться использовать TreeSets или другие структуры, предложенные в этом потоке.
источник
toList
.