6
votes

Est-ce que "Toarray" d'un ensemble est déterministe?

Évidemment, les ensembles n'ont aucun ordre de commande, je ne peux donc pas m'attendre à un ordre spécifique si je fais xxx

Cependant, je suis confronté à un cas d'utilisation où je m'en fiche Ce qui commande le tableau de chaîne est dans, mais j'en ai besoin d'être le cas que si deux ensembles sont égaux les uns aux autres, alors: xxx

produira la même chaîne exacte Pour les ensembles, toujours, peu importe le nombre de fois où je gère le programme en supposant que je bâille avec le même code.

ai-je cette garantie?

L'ordre que les éléments apparaissent pour un ensemble donné dans un itérateur?


3 commentaires

Un de côté: "Java" n'est pas un acronyme.


L'ensemble peut avoir une commande. Par exemple, Arbreset.


@kukudas J'ai vraiment pensé que "Aucun ordre" était l'une des exigences de facto d'un ensemble. Merci!


6 Réponses :


7
votes

En général, vous ne pouvez pas garantir l'ordre d'un définir comme vous le mentionnez, même si cela fonctionne maintenant, ce n'est peut-être pas à l'avenir. Cependant, vous peut garantir l'ordre d'un LinkedHashSet afin que vous puissiez simplement l'utiliser. Cela ne fonctionne que si les ensembles avaient cependant les éléments insérés dans le même ordre. Si vous n'avez pas cette situation, vous devez probablement juste trier l'ensemble et l'imprimer.


0 commentaires

4
votes

Non, absolument pas. Pour un exemple trivial, envisagez:

 LinkedHashSet<String> set1 = new LinkedHashSet<String>();
 set1.add("x");
 set1.add("y");

 LinkedHashSet<String> set2 = new LinkedHashSet<String>();
 set2.add("y");
 set2.add("x");


0 commentaires

2
votes

Vous n'avez pas cette garantie. Il se peut que vous voyiez toujours ce travail, car je soupçonne que la plupart des implémentations de set.toarray () produiront le même commandant pour des ensembles égaux, mais vous ne peut pas s'appuyer sur Ceci.

Vous ne pouvez pas compter sur la commande d'un itérateur.

Les ensembles sont complètement et totalement non ordonnés. Vous pourriez, en raison du comportement de mise en œuvre, obtenez quelque chose qui ressemble à une commande cohérente en dehors d'eux, mais cela n'est en aucun cas invoqué.


0 commentaires

4
votes

Techniquement, non, vous n'avez pas de garantie. SET est une interface. Les implémentations varieront et peuvent ou non obéir à cette exigence.

Forcer le problème en triant le tableau vous-même après avoir extrait les résultats de l'ensemble.


1 commentaires

Merci. Toutes les grandes réponses ici (précipitées toutes) mais celle-ci donne une solution claire. Je vais "forcer la question".



3
votes

qui serait complètement dépendant de la mise en œuvre . SET est une interface, pas une classe et toarray () ne garantit rien, sauf qu'il doit correspondre à l'itérateur de la mise en œuvre.

de la Javadoc pour set.totarray ():

Si cet ensemble effectue des garanties sur quel ordre ses éléments sont renvoyés par son itérateur, cette méthode doit renvoyer les éléments dans le même ordre.


0 commentaires

1
votes

Pour HashSet, vous pouvez ajouter un élément dans le même ordre et obtenir des commandes différentes en fonction de la capacité et du facteur de charge.

Voici un exemple où vous pouvez avoir de nombreuses commandes différentes de la même collection.

http: // vanillajava. blogspot.co.uk/2011/09/Ordon-Of-Element-in-hash-collection.html


0 commentaires