132 votes

.asSet(...) existe-t-il dans une API ?

Je cherche un moyen très simple de créer un ensemble.

Arrays.asList("a", "b" ...) crée un List<String>

Existe-t-il quelque chose de similaire pour Set ?

21voto

durron597 Points 9165

Comme d'autres l'ont dit, utilisez :

new HashSet<String>(Arrays.asList("a","b"));

La raison pour laquelle cela no existent en Java est que Arrays.asList renvoie une liste de taille fixe, en d'autres termes :

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

Les retours :

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 à l'intérieur de la Arrays classe. Pourquoi voulez-vous cela ? A Set garantit qu'il n'y a pas de doublons, mais si vous les tapez à la main, vous ne devriez pas avoir besoin de cette fonctionnalité... et List a plus de méthodes. Les deux interfaces étendent Collection y Iterable .


Comme d'autres l'ont dit, utilisez goyave Si vous voulez vraiment cette fonctionnalité - puisqu'elle n'est pas dans le JDK. Consultez leurs réponses (en particulier la réponse de Michael Schmeißer) pour obtenir des informations à ce sujet.

5voto

Stuart Clark Points 481

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));
  }

4voto

Evgeniy Dorofeev Points 52031

Non, mais vous pouvez le faire comme ceci

new HashSet<String>(Arrays.asList("a", "b", ...));

3voto

OscarRyz Points 82553

Sur goyave vous pourriez utiliser

Set<String> set = Sets.newHashSet("a","b","c");

nouveauHashSet

1voto

Philippe Gioseffi Points 312

Une autre façon de le faire en utilisant Java 8 et les enums serait :

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

Ver EnumSet .

Je recommanderais une analyse de performance entre cette approche et

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

parce que si vous avez plus de cinq éléments, la javadoc de la méthode indique qu'il peut y avoir des problèmes de performance, comme vous pouvez le voir dans la javadoc de Set.Of(E, E...) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X