Vous ne pouvez pas, car a Setn'a pas de méthodes d'accès aléatoire (c'est-à-dire .get()un élément à un index donné), ce qui est fondamentalement requis pour les algorithmes de tri;)
fge
3
Vous pouvez d'abord le convertir en liste, puis trier si vous avez besoin de trier
demongolem
Vous ne pouvez pas car a HashSetn'a pas d'ordre défini. Votre question incarne une contradiction dans les termes.
Le simple fait de mettre les éléments ne donnera pas la flexibilité de trier sur n'importe quel ordre avec n'importe quel élément à l'intérieur. La solution ci-dessus le fait.
Jess
16
Java 8 pour le trier serait:
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::getSizec'est un exemple comment trier naturellement le HashSet de YourItem par taille.
* Collectors.toList()va collecter le résultat du tri dans une liste avec laquelle vous devrez le capturerList<Foo> sortedListOfFoo =
Pourquoi supposez-vous qu'ils stockent des Stringvaleurs?
Sotirios Delimanolis
Je ne suis pas bien que peut-être que mon utilisation du lexographique soit imprécise ;-)
P45 Imminent
3
C'est vraiment faux. Il ne stocke pas les clés dans l'ordre lexographique (sp?). Il utilise soit leur ordre naturel (qui dépend de l' Comparableinterface implémentée par les clés), soit le fichier fourni Comparator.
Sotirios Delimanolis
J'ai édité. Vous pensez mieux, ou devrais-je supprimer la réponse?
P45 Imminent
1
Dans le cas où vous déplacez un HashSetvers TreeSet, votre classe doit implémenter une Comparableinterface ou fournir un fichier personnalisé Comparator. Sinon, puisque vous ne pouvez pas trier a HashSet, convertissez-le simplement en a Listet triez-le.
Luiggi Mendoza
5
Vous pouvez utiliser les collecteurs Java 8 et TreeSet
Les éléments de HashSet ne peuvent pas être triés. Chaque fois que vous mettez des éléments dans HashSet, cela peut perturber l'ordre de l'ensemble. Il est délibérément conçu comme ça pour la performance. Lorsque vous ne vous souciez pas de la commande, HashSet sera l'ensemble le plus efficace pour une insertion et une recherche rapides.
TreeSet triera automatiquement tous les éléments à chaque fois que vous insérez un élément.
Peut-être que vous essayez de trier une seule fois. Dans ce cas, TreeSet n'est pas la meilleure option car il doit déterminer le placement des éléments nouvellement ajoutés à tout moment.
La solution la plus efficace consiste à utiliser ArrayList. Créez une nouvelle liste et ajoutez tous les éléments puis triez-la une fois. Si vous souhaitez ne conserver que des éléments uniques (supprimez tous les doublons comme le fait set, puis mettez la liste dans un LinkedHashSet, il conservera l'ordre que vous avez déjà trié)
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.
Maintenant, vous avez obtenu un ensemble trié si vous le voulez sous forme de liste, puis convertissez-le en liste.
À mon humble avis, la réponse de LazerBanana devrait être la réponse la mieux notée et acceptée car toutes les autres réponses pointant vers java.util.TreeSet(ou d'abord converties en liste puis appelées Collections.sort(...)sur la liste convertie) n'ont pas pris la peine de demander à OP quel type d'objets vous avez, HashSetc'est-à-dire si ces éléments ont un ordre naturel prédéfini ou non et ce n'est pas une question facultative mais une question obligatoire.
Vous ne pouvez tout simplement pas entrer et commencer à mettre vos HashSetéléments dans un TreeSettype d'élément if n'implémente pas déjà l' Comparableinterface ou si vous ne passez pas explicitement Comparatorau TreeSetconstructeur.
Depuis TreeSetJavaDoc,
Construit un nouvel ensemble d'arbres vide, trié selon l'ordre naturel de ses éléments. Tous les éléments insérés dans l'ensemble doivent implémenter l'interface Comparable. De plus, tous ces éléments doivent être comparables entre eux: e1.compareTo (e2) ne doit pas lancer d'exception ClassCastException pour les éléments e1 et e2 de l'ensemble. Si l'utilisateur tente d'ajouter un élément à l'ensemble qui viole cette contrainte (par exemple, l'utilisateur tente d'ajouter un élément de chaîne à un ensemble dont les éléments sont des entiers), l'appel d'ajout lèvera une ClassCastException.
C'est pourquoi seules toutes les réponses basées sur le flux Java8 - où vous définissez votre comparateur sur place - n'ont de sens que car la mise en œuvre de comparables dans POJO devient facultative. Le programmeur définit le comparateur au fur et à mesure des besoins. Essayer de se rassembler TreeSetsans poser cette question fondamentale est également incorrect (réponse de Ninja). En supposant que les types d'objets sont Stringou Integersont également incorrects.
Cela dit, d'autres préoccupations comme,
Performances de tri
Empreinte mémoire (en conservant l'ensemble d'origine et en créant de nouveaux ensembles triés à chaque fois que le tri est effectué ou que vous souhaitez trier l'ensemble sur place, etc.)
devraient également être les autres points pertinents. Le simple fait de pointer vers l'API ne devrait pas être uniquement une intention.
Puisque l'ensemble d'origine ne contient déjà que des éléments uniques et que cette contrainte est également maintenue par ensemble trié, l'ensemble d'origine doit être effacé de la mémoire car les données sont dupliquées.
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);}}}
Si vous voulez que la fin Collectionsoit sous la forme de Setet si vous voulez définir la vôtre natural orderplutôt que celle de TreeSetalors -
1. Convertissez le HashSeten List
2. Tri personnalisé en Listutilisant Comparator
3. Reconvertissez le Listen LinkedHashSetpour maintenir l'ordre
4. Affichez le LinkedHashSet
Créez une liste et stockez-y toutes les valeurs de hachage
trier la liste à l'aide de Collections.sort ()
Stockez la liste dans LinkedHashSet car il préserve l'ordre d'insertion
Méthode 2:
Créez un treeSet et stockez-y toutes les valeurs.
La méthode 2 est plus préférable car l'autre méthode prend beaucoup de temps pour transférer des données dans les deux sens entre le hachage et la liste.
On ne peut pas décider que les éléments d'un HashSet seraient triés automatiquement. Mais nous pouvons les trier en les convertissant en TreeSet ou en n'importe quelle liste comme ArrayList ou LinkedList etc.
// 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");
J'ai utilisé ceci dans une instruction d'impression, donc si vous devez réellement persister la commande, vous devrez peut-être utiliser TreeSets ou d'autres structures proposées sur ce fil.
HashSet
est une collection non ordonnée.Set
n'a pas de méthodes d'accès aléatoire (c'est-à-dire.get()
un élément à un index donné), ce qui est fondamentalement requis pour les algorithmes de tri;)HashSet
n'a pas d'ordre défini. Votre question incarne une contradiction dans les termes.Réponses:
Un HashSet ne garantit aucun ordre de ses éléments. Si vous avez besoin de cette garantie, pensez à utiliser un TreeSet pour contenir vos éléments.
Cependant, si vous avez juste besoin que vos éléments soient triés pour cette occurrence, créez simplement temporairement une liste et triez-la:
la source
List<String> sortedList = new ArrayList<String>(yourHashSet);
Ajoutez tous vos objets au
TreeSet
, vous obtiendrez un ensemble trié. Voici un exemple brut.la source
TreeSet myTreeSet = new TreeSet(myHashSet);
vous pouvez éviter d'ajouter à nouveau tous les éléments à Treeset.Vous pouvez utiliser un TreeSet à la place.
la source
Java 8 pour le trier serait:
*
Foo::getSize
c'est un exemple comment trier naturellement le HashSet de YourItem par taille.*
Collectors.toList()
va collecter le résultat du tri dans une liste avec laquelle vous devrez le capturerList<Foo> sortedListOfFoo =
la source
Utilisez
java.util.TreeSet
comme objet réel. Lorsque vous parcourez cette collection, les valeurs reviennent dans un ordre bien défini.Si vous utilisez,
java.util.HashSet
l'ordre dépend d'une fonction de hachage interne qui n'est certainement pas lexicographique (basée sur le contenu).la source
String
valeurs?Comparable
interface implémentée par les clés), soit le fichier fourniComparator
.HashSet
versTreeSet
, votre classe doit implémenter uneComparable
interface ou fournir un fichier personnaliséComparator
. Sinon, puisque vous ne pouvez pas trier aHashSet
, convertissez-le simplement en aList
et triez-le.Vous pouvez utiliser les collecteurs Java 8 et TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))
la source
new TreeSet<>(hashSet)
est plus concis et probablement plus efficace.Vous pouvez utiliser TreeSet comme mentionné dans d'autres réponses.
Voici un peu plus de détails sur la façon de l'utiliser:
Production:
la source
Les éléments de HashSet ne peuvent pas être triés. Chaque fois que vous mettez des éléments dans HashSet, cela peut perturber l'ordre de l'ensemble. Il est délibérément conçu comme ça pour la performance. Lorsque vous ne vous souciez pas de la commande, HashSet sera l'ensemble le plus efficace pour une insertion et une recherche rapides.
TreeSet triera automatiquement tous les éléments à chaque fois que vous insérez un élément.
Peut-être que vous essayez de trier une seule fois. Dans ce cas, TreeSet n'est pas la meilleure option car il doit déterminer le placement des éléments nouvellement ajoutés à tout moment.
La solution la plus efficace consiste à utiliser ArrayList. Créez une nouvelle liste et ajoutez tous les éléments puis triez-la une fois. Si vous souhaitez ne conserver que des éléments uniques (supprimez tous les doublons comme le fait set, puis mettez la liste dans un LinkedHashSet, il conservera l'ordre que vous avez déjà trié)
Maintenant, vous avez obtenu un ensemble trié si vous le voulez sous forme de liste, puis convertissez-le en liste.
la source
Sur la base de la réponse donnée par @LazerBanana, je vais mettre mon propre exemple d'ensemble trié par l'ID de l'objet:
la source
Au cas où vous ne voudriez pas en utiliser,
TreeSet
vous pouvez essayer ceci.la source
À mon humble avis, la réponse de LazerBanana devrait être la réponse la mieux notée et acceptée car toutes les autres réponses pointant vers
java.util.TreeSet
(ou d'abord converties en liste puis appeléesCollections.sort(...)
sur la liste convertie) n'ont pas pris la peine de demander à OP quel type d'objets vous avez,HashSet
c'est-à-dire si ces éléments ont un ordre naturel prédéfini ou non et ce n'est pas une question facultative mais une question obligatoire.Vous ne pouvez tout simplement pas entrer et commencer à mettre vos
HashSet
éléments dans unTreeSet
type d'élément if n'implémente pas déjà l'Comparable
interface ou si vous ne passez pas explicitementComparator
auTreeSet
constructeur.Depuis
TreeSet
JavaDoc,C'est pourquoi seules toutes les réponses basées sur le flux Java8 - où vous définissez votre comparateur sur place - n'ont de sens que car la mise en œuvre de comparables dans POJO devient facultative. Le programmeur définit le comparateur au fur et à mesure des besoins. Essayer de se rassembler
TreeSet
sans poser cette question fondamentale est également incorrect (réponse de Ninja). En supposant que les types d'objets sontString
ouInteger
sont également incorrects.Cela dit, d'autres préoccupations comme,
devraient également être les autres points pertinents. Le simple fait de pointer vers l'API ne devrait pas être uniquement une intention.
Puisque l'ensemble d'origine ne contient déjà que des éléments uniques et que cette contrainte est également maintenue par ensemble trié, l'ensemble d'origine doit être effacé de la mémoire car les données sont dupliquées.
la source
la source
Si vous voulez que la fin
Collection
soit sous la forme deSet
et si vous voulez définir la vôtrenatural order
plutôt que celle deTreeSet
alors -1. Convertissez le
HashSet
enList
2. Tri personnalisé en
List
utilisantComparator
3. Reconvertissez le
List
enLinkedHashSet
pour maintenir l'ordre4. Affichez le
LinkedHashSet
Exemple de programme -
Production -
Ici, la collection a été triée comme -
Première - Ordre décroissant de
String
longueurSeconde - Ordre décroissant de la
String
hiérarchie alphabétiquela source
vous pouvez le faire des manières suivantes:
Méthode 1:
Méthode 2:
La méthode 2 est plus préférable car l'autre méthode prend beaucoup de temps pour transférer des données dans les deux sens entre le hachage et la liste.
la source
On ne peut pas décider que les éléments d'un HashSet seraient triés automatiquement. Mais nous pouvons les trier en les convertissant en TreeSet ou en n'importe quelle liste comme ArrayList ou LinkedList etc.
la source
Vous pouvez utiliser la bibliothèque de goyave pour le même
la source
SortedSet a été ajouté depuis java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
la source
Vous pouvez l'envelopper dans un TreeSet comme ceci:
sortie:
éléments mySet [1, 3, 4, 5]
éléments treeSet [1, 3, 4, 5]
sortie:
éléments mySet [six, quatre, cinq, deux, elf]
éléments treeSet [elf, cinq, quatre, six, deux]
La condition requise pour cette méthode est que les objets de l'ensemble / de la liste doivent être comparables (implémenter l'interface Comparable)
la source
Cette simple commande a fait l'affaire pour moi:
J'ai utilisé ceci dans une instruction d'impression, donc si vous devez réellement persister la commande, vous devrez peut-être utiliser TreeSets ou d'autres structures proposées sur ce fil.
la source
toList
.