Je voudrais convertir un tableau en un ensemble en Java. Il existe des façons évidentes de le faire (c'est-à-dire avec une boucle) mais je voudrais quelque chose d'un peu plus net, quelque chose comme:
java.util.Arrays.asList(Object[] a);
Des idées?
java
collections
arrays
set
Bob Gilmore
la source
la source
Arrays.asList
est O (1).C'est Collections.addAll (java.util.Collection, T ...) de JDK 6.
De plus: que faire si notre tableau est plein de primitives?
Pour JDK <8, j'écrirais simplement la
for
boucle évidente pour effectuer le bouclage et l'ajout à l'ensemble en une seule passe.Pour JDK> = 8, une option intéressante est quelque chose comme:
la source
java.util.Collections.addAll
. De plus, je ne recommanderais plus les collections Commons, sans qu'il soit généré et que la goyave existe.addAll
sera O ( n ).Avec la goyave, vous pouvez faire:
la source
new HashSet<T>(Arrays.asList(someArray))
. Voir google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
la source
Varargs fonctionnera aussi!
la source
Java 8
Nous avons également la possibilité d'utiliser
Stream
. Nous pouvons obtenir un flux de différentes manières:Le code source de
Collectors.toSet()
montre que les éléments sont ajoutés un par un à aHashSet
mais la spécification ne garantit pas que ce sera unHashSet
.Il est donc préférable d'utiliser la dernière option. La sortie est:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Ensemble immuable (Java 9)
Java 9 a introduit
Set.of
une méthode d'usine statique qui renvoie un ensemble immuable pour les éléments fournis ou le tableau.Consultez les Méthodes d'usine statiques définies immuables pour plus de détails.
Ensemble immuable (Java 10)
Nous pouvons également obtenir un ensemble immuable de deux manières:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
La méthode
Collectors.toUnmodifiableList()
utilise en interne l'Set.of
introduction de Java 9. Consultez également ma réponse pour en savoir plus.la source
Stream.of()
- je ne le connaissais pas. Un petit problèmeCollectors.toSet()
: vous dites que la spécification ne garantit pas l'ajout d'éléments un par un, mais c'est ce que cela signifie par: "s'accumule ... dans un nouveauSet
". Et c'est plus lisible - donc préférable à mon avis, si vous n'avez pas besoin des garanties de type concret, de mutabilité, de sérialisation et de sécurité des threads.HashSet
. Cela garantit seulement que ce sera unSet
et c'est ce que je veux dire. J'espère que je l'ai clarifié.Après cela,
Arrays.asList(array)
vous pouvez exécuterSet set = new HashSet(list);
Voici un exemple de méthode, vous pouvez écrire:
la source
Dans les collections Eclipse , les éléments suivants fonctionnent:
Remarque: je suis un committer pour les collections Eclipse
la source
Rapidement: vous pouvez faire:
et inverser
la source
J'ai écrit ci-dessous des conseils ci-dessus - volez-le ... c'est bien!
la source
Il y a eu beaucoup de bonnes réponses déjà, mais la plupart d'entre eux ne fonctionnera pas avec tableau de primitives (comme
int[]
,long[]
,char[]
,byte[]
, etc.)En Java 8 et supérieur, vous pouvez encadrer le tableau avec:
Convertissez ensuite en ensemble à l'aide de stream:
la source
Parfois, l'utilisation de certaines bibliothèques standard aide beaucoup. Essayez de regarder les collections Apache Commons . Dans ce cas, vos problèmes sont simplement transformés en quelque chose comme ça
Et voici les CollectionsUtils javadoc
la source
java.util.Collections.addAll(myEmptySet, keys);
??Utiliser
CollectionUtils
ou àArrayUtils
partir destanford-postagger-3.0.jar
la source
En Java 10 :
Set.copyOf
renvoie unSet
élément non modifiable contenant les éléments du donnéCollection
.Le donné
Collection
ne doit pas l'êtrenull
et ne doit contenir aucunnull
élément.la source
la sortie est
le changer en
la sortie est
la source
Pour tous ceux qui résolvent pour Android:
Kotlin Collections Solution
L'astérisque
*
est l'spread
opérateur. Il applique tous les éléments d'une collection individuellement, chacun étant passé dans l'ordre à unvararg
paramètre de méthode. Il équivaut à:La transmission d'aucun paramètre
setOf()
entraîne un ensemble vide.De plus
setOf
, vous pouvez également utiliser n'importe lequel de ces éléments pour un type de hachage spécifique:Voici comment définir explicitement le type d'élément de collection.
la source
new HashSet<Object>(Arrays.asList(Object[] a));
Mais je pense que ce serait plus efficace:
la source
HashSet
est définie en fonction de la taille du tableau, par exemple.la source