Question Comment convertir un tableau en ensemble en Java


Je voudrais convertir un tableau en Set en Java. Il y a 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?


556
2018-06-17 18:23


origine


Réponses:


Comme ça:

Set<T> mySet = new HashSet<T>(Arrays.asList(someArray));

En Java 9+, si l'ensemble non modifiable est correct:

Set<T> mySet = Set.of(someArray);

Dans Java 10+, le paramètre de type générique peut être déduit du type de composant tableaux:

var mySet = Set.of(someArray);

978
2018-06-17 18:27



Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);

C'est Collections.addAll (java.util.Collection, T ...) à partir du JDK 6.

Aditionellement: Et si notre tableau est plein de primitives?

Pour JDK <8, je voudrais juste écrire l'évidence for boucle pour faire le wrap et ajouter-à-ensemble en un seul passage.

Pour JDK> = 8, une option intéressante est quelque chose comme:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());

179
2018-06-17 18:37



Avec Goyave tu peux faire:

T[] array = ...
Set<T> set = Sets.newHashSet(array);

110
2018-06-17 18:36



Java 8:

String[] strArray = {"eins", "zwei", "drei", "vier"};

Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());
System.out.println(strSet);
// [eins, vier, zwei, drei]

55
2018-02-02 16:03



Varargs va travailler aussi!

Stream.of(T... values).collect(Collectors.toSet());

30
2017-09-16 07:44



En Java 8, nous avons la possibilité d'utiliser Stream ainsi que. Nous pouvons obtenir un flux de différentes manières:

Set<String> set = Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
System.out.println(set);

String[] stringArray = {"A", "B", "C", "D"};
Set<String> strSet1 = Arrays.stream(stringArray).collect(Collectors.toSet());
System.out.println(strSet1);

Set<String> strSet2 = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
System.out.println(strSet2);

Le code source de Collectors.toSet() montre que les éléments sont ajoutés un par un à un HashSet mais la spécification ne garantit pas qu'il s'agira d'un HashSet: "Il n'y a aucune garantie sur le type, la mutabilité, la sérialisation ou la sécurité des threads de l'ensemble retourné." Il est donc préférable d'utiliser l'option ultérieure. La sortie est: [A, B, C, D] [A, B, C, D] [A, B, C, D]


19
2018-06-24 05:38



Après vous faites Arrays.asList(array) vous pouvez exécuter Set set = new HashSet(list);

Voici une méthode d'exemple, vous pouvez écrire:

public <T> Set<T> GetSetFromArray(T[] array) {
    return new HashSet<T>(Arrays.asList(array));
}

18
2018-06-17 18:27



Dans Collections Eclipse, ce qui suit fonctionnera:

Set<Integer> set1 = Sets.mutable.of(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.mutable.of(new Integer[]{1, 2, 3, 4, 5});
MutableSet<Integer> mutableSet = Sets.mutable.of(1, 2, 3, 4, 5);
ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3, 4, 5);

Set<Integer> unmodifiableSet = Sets.mutable.of(1, 2, 3, 4, 5).asUnmodifiable();
Set<Integer> synchronizedSet = Sets.mutable.of(1, 2, 3, 4, 5).asSynchronized();
ImmutableSet<Integer> immutableSet = Sets.mutable.of(1, 2, 3, 4, 5).toImmutable();

Note: Je suis un committer pour les collections Eclipse


10
2017-12-18 23:04