Comment convertir Un tableau en un ensemble en Java

je voudrais convertir un tableau en un ensemble en Java. Il y a des façons évidentes de le faire (par exemple 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?

572
demandé sur Bob Gilmore 2010-06-17 22:23:56

16 réponses

comme ceci:

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

En Java 9+, si inmodifiable ensemble est ok:

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

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

var mySet = Set.of(someArray);
1012
répondu SLaks 2018-04-24 17:54:21
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);

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

en plus: et si notre réseau est plein de primitifs?

pour JDK < 8, j'écrirais simplement la boucle évidente for pour faire le wrap et ajouter-to-set en un passage.

pour JDK > = 8, une option attrayante est quelque chose comme:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());
183
répondu JavadocMD 2016-04-13 23:39:53

Avec Goyave vous pouvez le faire:

T[] array = ...
Set<T> set = Sets.newHashSet(array);
112
répondu ColinD 2010-06-17 18:36:03

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]
57
répondu max 2015-12-10 16:33:18

Varargs marchera aussi!

Stream.of(T... values).collect(Collectors.toSet());
34
répondu Alex 2017-09-05 20:48:34

Dans Java 8 nous avons la possibilité d'utiliser des Stream . Nous pouvons obtenir le flux de diverses façons:

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 des éléments sont ajoutés un par un à un HashSet mais la spécification ne garantit pas qu'il sera un HashSet .

"Il n'y a pas de garanties sur le type, la mutabilité, serializability, ou fil-sécurité 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
répondu i_am_zero 2018-10-03 04:24:58

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

Voici un exemple de méthode, vous pouvez écrire:

public <T> Set<T> GetSetFromArray(T[] array) {
    return new HashSet<T>(Arrays.asList(array));
}
18
répondu Petar Minchev 2011-10-26 06:20:23

Dans Eclipse Collections , le suivant:

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 Eclipse Collections

10
répondu Donald Raab 2017-02-21 03:32:30

rapidement : vous pouvez faire:

// Fixed-size list
List list = Arrays.asList(array);

// Growable list
list = new LinkedList(Arrays.asList(array));

// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));

et à l'inverse

// Create an array containing the elements in a list
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);

// Create an array containing the elements in a set
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);
6
répondu Pierre-Olivier Pignon 2011-11-04 09:30:37

j'ai écrit ce qui suit du Conseil ci - dessus-voler... c'est sympa!

/**
 * Handy conversion to set
 */
public class SetUtil {
    /**
     * Convert some items to a set
     * @param items items
     * @param <T> works on any type
     * @return a hash set of the input items
     */
    public static <T> Set<T> asSet(T ... items) {
        return Stream.of(items).collect(Collectors.toSet());
    }
}
5
répondu Ashley Frieze 2016-04-28 22:10:39

parfois, l'utilisation de certaines bibliothèques standard aide beaucoup. Essayez de regarder le Apache communs Collections . Dans ce cas, vos problèmes sont simplement transformés en quelque chose comme ceci

String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);

et voici le Collectionssutils javadoc

0
répondu mnagni 2012-01-04 17:13:21
    private Map<Integer, Set<Integer>> nobreaks = new HashMap();
    nobreaks.put(1, new HashSet(Arrays.asList(new int[]{2, 4, 5})));
    System.out.println("expected size is 3: " +nobreaks.get(1).size());

la sortie est

    expected size is 3: 1

changer pour

    nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 )));

la sortie est

    expected size is 3: 3
0
répondu Bruce Zu 2016-08-28 20:43:52

utiliser CollectionUtils ou ArrayUtils de stanford-postagger-3.0.jar

import static edu.stanford.nlp.util.ArrayUtils.asSet;
or 
import static edu.stanford.nlp.util.CollectionUtils.asSet;

  ...
String [] array = {"1", "q"};
Set<String> trackIds = asSet(array);
0
répondu Olexandra Dmytrenko 2018-05-21 21:26:45

In Java 10 :

String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));

Set.copyOf renvoie un Set contenant les éléments du Collection donné .

Le Collection ne doit pas être null , et il ne doit pas contenir de null éléments.

0
répondu Oleksandr 2018-08-22 10:11:53

new HashSet<Object>(Arrays.asList(Object[] a));

Mais je pense que ce serait plus efficace:

final Set s = new HashSet<Object>();    
for (Object o : a) { s.add(o); }         
-2
répondu Ben S 2015-10-14 23:09:24
Set<T> b = new HashSet<>(Arrays.asList(requiredArray));
-3
répondu Satyendra Jaiswal 2016-01-12 12:38:33