Nie możesz, ponieważ a Setnie ma metod dostępu swobodnego (tj. .get()Elementu o podanym indeksie), co jest w zasadzie wymagane dla algorytmów sortowania;)
fge
3
Możesz najpierw przekonwertować go na listę, a następnie posortować, jeśli chcesz posortować
demongolem
Nie możesz, ponieważ HashSetnie ma zdefiniowanej kolejności. Twoje pytanie uosabia sprzeczność terminów.
Samo umieszczenie elementów nie zapewni elastyczności sortowania w dowolnej kolejności z dowolnym elementem w środku. Powyższe rozwiązanie działa.
Jess
16
Sposób sortowania w Javie 8 to:
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::getSizeto przykład, jak naturalnie sortować HashSet YourItem według rozmiaru.
* Collectors.toList()ma zamiar zebrać wynik sortowania do listy, z którą będziesz musiał go przechwycićList<Foo> sortedListOfFoo =
Dlaczego zakładasz, że przechowują Stringwartości?
Sotirios Delimanolis
Nie jestem, chociaż może moje użycie leksografii jest nieprecyzyjne ;-)
P45 Imminent
3
To bardzo źle. Nie przechowuje kluczy w porządku leksograficznym (sp?). Używa ich naturalnej kolejności (która zależy od Comparableinterfejsu, który implementują klucze) lub korzysta z dostarczonego Comparator.
Sotirios Delimanolis
Edytowałem. Myślisz, że lepiej, czy powinienem usunąć odpowiedź?
P45 Imminent
1
W przypadku przeniesienia HashSetdo TreeSet, Twoja klasa musi zaimplementować Comparableinterfejs lub zapewnić niestandardowy Comparator. W przeciwnym razie, ponieważ nie możesz posortować a HashSet, po prostu przekonwertuj go na a Listi posortuj.
Nie można sortować elementów w HashSet. Za każdym razem, gdy umieszczasz elementy w HashSet, może to zepsuć porządek całego zestawu. Jest celowo zaprojektowany w ten sposób z myślą o wydajności. Kiedy nie zależy Ci na kolejności, HashSet będzie najbardziej wydajnym zestawem do szybkiego wstawiania i wyszukiwania.
TreeSet automatycznie posortuje wszystkie elementy za każdym razem, gdy wstawisz element.
Być może to, co próbujesz zrobić, to posortować tylko raz. W takim przypadku TreeSet nie jest najlepszą opcją, ponieważ musi przez cały czas określać położenie nowo dodanych elementów.
Najbardziej wydajnym rozwiązaniem jest użycie ArrayList. Utwórz nową listę i dodaj wszystkie elementy, a następnie posortuj ją raz. Jeśli chcesz zachować tylko unikalne elementy (usuń wszystkie duplikaty, tak jak robi to set, a następnie umieść listę w LinkedHashSet, zachowa kolejność, którą już posortowałeś)
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.
Teraz masz posortowany zestaw, jeśli chcesz go w formie listy, a następnie przekonwertuj go na listę.
Moim skromnym zdaniem odpowiedź LazerBanana powinna być najwyżej ocenioną odpowiedzią i zaakceptowaną, ponieważ wszystkie inne odpowiedzi wskazujące java.util.TreeSet(lub najpierw przekonwertowane na listę, a następnie wywołane Collections.sort(...)na przekonwertowanej liście) nie zadały sobie trudu, aby zapytać OP, jakiego rodzaju obiekty masz HashSet, tj. czy te elementy mają predefiniowany porządek naturalny, czy nie, i nie jest to pytanie opcjonalne, ale pytanie obowiązkowe.
Po prostu nie możesz wejść i zacząć umieszczać swoich HashSetelementów w TreeSettypie elementu if nie implementuje jeszcze Comparableinterfejsu lub jeśli nie przekazujesz jawnie Comparatordo TreeSetkonstruktora.
Z TreeSetJavaDoc,
Konstruuje nowy, pusty zestaw drzew, posortowany zgodnie z naturalnym uporządkowaniem jego elementów. Wszystkie elementy wstawiane do zestawu muszą implementować interfejs Comparable. Ponadto wszystkie takie elementy muszą być wzajemnie porównywalne: e1.compareTo (e2) nie może zgłaszać wyjątku ClassCastException dla żadnych elementów e1 i e2 w zestawie. Jeśli użytkownik spróbuje dodać element do zestawu, który narusza to ograniczenie (na przykład użytkownik próbuje dodać element ciągu do zestawu, którego elementy są liczbami całkowitymi), wywołanie add zwróci ClassCastException.
Dlatego tylko wszystkie odpowiedzi oparte na strumieniu Java8 - gdzie definiujesz swój komparator na miejscu - mają sens tylko dlatego, że implementacja porównywalnego w POJO staje się opcjonalna. Programista definiuje komparator w razie potrzeby. Próba zebrania się TreeSetbez zadawania tego podstawowego pytania jest również niepoprawna (odpowiedź Ninja). Zakładanie, że typy obiektów są Stringlub Integerteż są nieprawidłowe.
To powiedziawszy, inne obawy, takie jak:
Wydajność sortowania
Memory Foot Print (zachowywanie oryginalnego zestawu i tworzenie nowych posortowanych zestawów za każdym razem, gdy sortowanie jest wykonywane lub chcesz posortować zestaw na miejscu itp.)
powinny być również inne istotne punkty. Samo wskazanie na API nie powinno być tylko intencją.
Ponieważ oryginalny zestaw zawiera już tylko unikalne elementy i to ograniczenie jest również utrzymywane przez posortowany zestaw, więc oryginalny zestaw musi zostać usunięty z pamięci, ponieważ dane są zduplikowane.
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);}}}
Jeśli chcesz, aby koniec Collectionbył w formie Seti jeśli chcesz zdefiniować swój własny, natural ordera nie ten TreeSet-
1. Przekształć HashSetw List
2. Własny posortuj Listużywając Comparator
3. Zamień z powrotem Listna, LinkedHashSetaby zachować porządek
4. Wyświetl LinkedHashSet
Nie możemy zdecydować, że elementy HashSet będą sortowane automatycznie. Ale możemy je sortować, konwertując na TreeSet lub dowolną listę, taką jak ArrayList lub LinkedList itp.
// 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");
Użyłem tego w instrukcji print, więc jeśli chcesz rzeczywiście zachować porządkowanie, może być konieczne użycie TreeSets lub innych struktur proponowanych w tym wątku.
HashSet
to nieuporządkowana kolekcja.Set
nie ma metod dostępu swobodnego (tj..get()
Elementu o podanym indeksie), co jest w zasadzie wymagane dla algorytmów sortowania;)HashSet
nie ma zdefiniowanej kolejności. Twoje pytanie uosabia sprzeczność terminów.Odpowiedzi:
HashSet nie gwarantuje żadnej kolejności swoich elementów. Jeśli potrzebujesz tej gwarancji, rozważ użycie TreeSet do przechowywania elementów.
Jeśli jednak potrzebujesz tylko posortowanych elementów dla tego jednego wystąpienia, po prostu tymczasowo utwórz Listę i posortuj ją:
źródło
List<String> sortedList = new ArrayList<String>(yourHashSet);
Dodaj wszystkie swoje obiekty do
TreeSet
, a otrzymasz posortowany zestaw. Poniżej znajduje się surowy przykład.źródło
TreeSet myTreeSet = new TreeSet(myHashSet);
możesz uniknąć ponownego dodawania wszystkich elementów do zestawu drzew.Zamiast tego możesz użyć TreeSet .
źródło
Sposób sortowania w Javie 8 to:
*
Foo::getSize
to przykład, jak naturalnie sortować HashSet YourItem według rozmiaru.*
Collectors.toList()
ma zamiar zebrać wynik sortowania do listy, z którą będziesz musiał go przechwycićList<Foo> sortedListOfFoo =
źródło
Użyj
java.util.TreeSet
jako rzeczywistego obiektu. Podczas iteracji po tej kolekcji wartości wracają w dobrze zdefiniowanej kolejności.Jeśli używasz,
java.util.HashSet
kolejność zależy od wewnętrznej funkcji skrótu, która prawie na pewno nie jest leksykograficzna (oparta na treści).źródło
String
wartości?Comparable
interfejsu, który implementują klucze) lub korzysta z dostarczonegoComparator
.HashSet
doTreeSet
, Twoja klasa musi zaimplementowaćComparable
interfejs lub zapewnić niestandardowyComparator
. W przeciwnym razie, ponieważ nie możesz posortować aHashSet
, po prostu przekonwertuj go na aList
i posortuj.Możesz użyć kolektorów Java 8 i TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))
źródło
new TreeSet<>(hashSet)
jest bardziej zwięzły i prawdopodobnie bardziej wydajny.Możesz użyć TreeSet, jak wspomniano w innych odpowiedziach.
Oto trochę więcej informacji na temat tego, jak z niego korzystać:
Wynik:
źródło
Nie można sortować elementów w HashSet. Za każdym razem, gdy umieszczasz elementy w HashSet, może to zepsuć porządek całego zestawu. Jest celowo zaprojektowany w ten sposób z myślą o wydajności. Kiedy nie zależy Ci na kolejności, HashSet będzie najbardziej wydajnym zestawem do szybkiego wstawiania i wyszukiwania.
TreeSet automatycznie posortuje wszystkie elementy za każdym razem, gdy wstawisz element.
Być może to, co próbujesz zrobić, to posortować tylko raz. W takim przypadku TreeSet nie jest najlepszą opcją, ponieważ musi przez cały czas określać położenie nowo dodanych elementów.
Najbardziej wydajnym rozwiązaniem jest użycie ArrayList. Utwórz nową listę i dodaj wszystkie elementy, a następnie posortuj ją raz. Jeśli chcesz zachować tylko unikalne elementy (usuń wszystkie duplikaty, tak jak robi to set, a następnie umieść listę w LinkedHashSet, zachowa kolejność, którą już posortowałeś)
Teraz masz posortowany zestaw, jeśli chcesz go w formie listy, a następnie przekonwertuj go na listę.
źródło
Na podstawie odpowiedzi udzielonej przez @LazerBanana zamieszczę własny przykład Zestawu posortowanego według Id Obiektu:
źródło
Na wypadek, gdybyś nie chciał tego użyć,
TreeSet
możesz spróbować.źródło
Moim skromnym zdaniem odpowiedź LazerBanana powinna być najwyżej ocenioną odpowiedzią i zaakceptowaną, ponieważ wszystkie inne odpowiedzi wskazujące
java.util.TreeSet
(lub najpierw przekonwertowane na listę, a następnie wywołaneCollections.sort(...)
na przekonwertowanej liście) nie zadały sobie trudu, aby zapytać OP, jakiego rodzaju obiekty maszHashSet
, tj. czy te elementy mają predefiniowany porządek naturalny, czy nie, i nie jest to pytanie opcjonalne, ale pytanie obowiązkowe.Po prostu nie możesz wejść i zacząć umieszczać swoich
HashSet
elementów wTreeSet
typie elementu if nie implementuje jeszczeComparable
interfejsu lub jeśli nie przekazujesz jawnieComparator
doTreeSet
konstruktora.Z
TreeSet
JavaDoc,Dlatego tylko wszystkie odpowiedzi oparte na strumieniu Java8 - gdzie definiujesz swój komparator na miejscu - mają sens tylko dlatego, że implementacja porównywalnego w POJO staje się opcjonalna. Programista definiuje komparator w razie potrzeby. Próba zebrania się
TreeSet
bez zadawania tego podstawowego pytania jest również niepoprawna (odpowiedź Ninja). Zakładanie, że typy obiektów sąString
lubInteger
też są nieprawidłowe.To powiedziawszy, inne obawy, takie jak:
powinny być również inne istotne punkty. Samo wskazanie na API nie powinno być tylko intencją.
Ponieważ oryginalny zestaw zawiera już tylko unikalne elementy i to ograniczenie jest również utrzymywane przez posortowany zestaw, więc oryginalny zestaw musi zostać usunięty z pamięci, ponieważ dane są zduplikowane.
źródło
źródło
Jeśli chcesz, aby koniec
Collection
był w formieSet
i jeśli chcesz zdefiniować swój własny,natural order
a nie tenTreeSet
-1. Przekształć
HashSet
wList
2. Własny posortuj
List
używającComparator
3. Zamień z powrotem
List
na,LinkedHashSet
aby zachować porządek4. Wyświetl
LinkedHashSet
Przykładowy program -
Wynik -
Tutaj zbiór został posortowany jako -
Pierwszy - Malejąca kolejność
String
długościDruga - Malejąca kolejność w
String
hierarchii alfabetycznejźródło
możesz to zrobić w następujący sposób:
Metoda 1:
Metoda 2:
Metoda 2 jest bardziej preferowana, ponieważ druga metoda zajmuje dużo czasu na przesyłanie danych tam iz powrotem między hashset a listą.
źródło
Nie możemy zdecydować, że elementy HashSet będą sortowane automatycznie. Ale możemy je sortować, konwertując na TreeSet lub dowolną listę, taką jak ArrayList lub LinkedList itp.
źródło
Możesz użyć biblioteki guawy do tego samego
źródło
SortedSet został dodany od wersji java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
źródło
Możesz zawinąć go w TreeSet w następujący sposób:
wynik:
elementy mySet [1, 3, 4, 5]
treeSet elementy [1, 3, 4, 5]
wyjście:
elementy mySet [sześć, cztery, pięć, dwa, elf]
treeSet elementy [elf, pięć, cztery, sześć, dwa]
wymaganiem dla tej metody jest, aby obiekty zestawu / listy były porównywalne (zaimplementuj interfejs Comparable)
źródło
Ta prosta komenda załatwiła sprawę:
Użyłem tego w instrukcji print, więc jeśli chcesz rzeczywiście zachować porządkowanie, może być konieczne użycie TreeSets lub innych struktur proponowanych w tym wątku.
źródło
toList
.