Je cherche un moyen très simple de créer un ensemble.
Arrays.asList("a", "b" ...)
crée un List<String>
Y a-t-il quelque chose de similaire pour Set
?
Maintenant, avec Java 8, vous pouvez le faire sans avoir besoin d'un framework tiers:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Voir Collectionneurs .
Prendre plaisir!
Vous pourriez utiliser
new HashSet<String>(Arrays.asList("a","b"));
Pour les cas spéciaux d'ensembles avec zéro ou un membre, vous pouvez utiliser:
Java.util.Collections.EMPTY_SET
et:
Java.util.Collections.singleton("A")
Comme d'autres l'ont dit, utilisez:
new HashSet<String>(Arrays.asList("a","b"));
La raison pour laquelle not n'existe pas en Java est que Arrays.asList
renvoie une liste de taille fixe, autrement dit:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Résultats:
Exception in thread "main" Java.lang.UnsupportedOperationException
at Java.util.AbstractList.add(Unknown Source)
at Java.util.AbstractList.add(Unknown Source)
Il n'y a pas d'implémentation JDK d'une "taille fixe" Set
dans la classe Arrays
. Pourquoi vous voulez ceci? Un Set
garantit qu'il n'y a pas de doublons, mais si vous les saisissez manuellement, vous ne devriez pas avoir besoin de cette fonctionnalité ... et List
a plus de méthodes. Les deux interfaces étendent Collection
et Iterable
.
Comme d'autres l'ont déjà dit, utilisez goyave Si vous voulez vraiment cette fonctionnalité - puisqu'elle ne se trouve pas dans le JDK. Regardez leurs réponses (en particulier celle de Michael Schmeißer) pour plus d'informations à ce sujet.
En Java 9, une fonction similaire a été ajoutée via les méthodes d'usine:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Il existe également des équivalents pour List
.)
Voici une petite méthode que vous pouvez utiliser
/**
* Utility method analogous to {@link Java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
Non mais tu peux le faire comme ça
new HashSet<String>(Arrays.asList("a", "b", ...));
Une autre façon de le faire en utilisant Java 8 et les enums serait:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Voir EnumSet .
Je recommanderais une analyse de performance entre cette approche et
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
car si vous avez plus de cinq éléments, le javadoc de la méthode indique des problèmes de performances, comme vous pouvez le constater dans le javadoc de Set.Of (E, E ...) .