Estoy buscando una manera muy sencilla de crear un Conjunto.

Arrays.asList("a", "b" ...) crea un List<String>

Hay algo similar para Set ?

InformationsquelleAutor cahen | 2013-05-03

10 Comentarios

  1. 62

    Ahora con Java 8 usted puede hacer esto sin necesidad de terceros marco:

    Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

    Ver Los coleccionistas.

    Disfrutar!

    • Hoy en día con Java 8 esta es probablemente la mejor respuesta, porque no depende de la 3ª parte de las bibliotecas y puede ser fácilmente adaptado a otros tipos de colección, así que me voy a configurar como la aceptación de uno. Muchas gracias a todos por los otros grandes soluciones. (por cierto, este Conjunto es mutable)
    • Ahora, quien dijo que Java era demasiado detallado? Por supuesto, esta es la mejor respuesta!
    • Agradezco mucho a @BobDoolittle !
    • Para cualquier persona que utiliza java 9+ por favor también ver a Holly respuesta a continuación: stackoverflow.com/a/48025159/229743
    • Yo prefiero usar el Java 8 «Stream» de manera que el Java 9 característica, porque «los coleccionistas» permite personalizar la colección resultante (puede ser «Lista», «Conjunto» o cualquier estructura personalizada deseado), mientras que las utilidades de java 9 debe ser llamado separados para cada tipo de colección (y no todas las estructuras tienen un correspondiente «util» ).
  2. 58

    Utilizando La guayaba, es tan simple como eso:

    Set<String> mySet = ImmutableSet.<String> of("a", "b");

    O para un conjunto mutable:

    Set<String> mySet = Sets.newHashSet("a", "b")

    Para más tipos de datos ver el La guayaba guía del usuario

    • Hay un no-inmutable versión de este?
    • sí: Sets.newHashSet("a", "b") o Sets.newLinkedHashSet("a", "b")
    • He añadido un mutable variante de la respuesta.
    • en realidad, Sets.newLinkedHashSet() no existe con esa firma, lo siento
    • Yo era capaz de eliminar uno de los argumentos de tipo: Set<String> mySet = ImmutableSet.of("a", "b");
    • Que sólo funcionará en java 7+, que incluye el diamante operador

  3. 23

    Para los casos especiales de conjuntos con cero o uno de los miembros, se puede utilizar:

    java.util.Collections.EMPTY_SET

    y:

    java.util.Collections.singleton("A")
    • para estos casos especiales, es probable que la mejor solución, ya que utiliza el estándar de java.util de la API
    • java.util.Collections.emptySet() es, en mi mente, preferido sobre EMPTY_SET, debido al tipo de seguridad. A partir de las observaciones en la clase de Colecciones: Unlike the like-named field, this method is parameterized.
  4. 17

    Como otros han dicho, uso:

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

    La razón de esto hace no existen en Java es que Arrays.asList devuelve un fijo del tamaño de la lista, en otras palabras:

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

    Devuelve:

    Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(Unknown Source)
        at java.util.AbstractList.add(Unknown Source)

    No hay JDK implementación de un «tamaño fijo» Set dentro de la Arrays clase. ¿Por qué quieres esto? Un Set garantiza que no hay duplicados, pero si usted está escribiendo a mano, no es necesario que la funcionalidad… y List tiene más métodos. Ambas interfaces extender Collection y Iterable.


    Como han dicho otros, el uso de la guayaba Si usted realmente desea que esta funcionalidad ya no está en el JDK. Mire sus respuestas (en particular Michael Schmeißer la respuesta) para obtener información sobre eso.

    • Esta es la mejor respuesta hasta ahora, porque señala lo Matrices.asList() en realidad tiene. Muchos desarrolladores parecen creer que las Matrices.asList() crea un java.util.ArrayList, mientras que en realidad crea un java.util.Matrices de$ArrayList (que es sólo parcialmente mutable y una vista en vivo de la matriz subyacente)
    • En cuanto a por qué alguien querría hacer esto, la razón más común para la construcción de un Conjunto (o Lista) de la mano es en una clase de prueba donde se pasa en los valores de la prueba.
  5. 12

    En Java 9, función similar ha sido añadido a través de métodos de fábrica:

    Set<String> oneLinerSet = Set.of("a", "b", ...);

    (Hay equivalentes para List así.)

    • He intentado esto y tengo una advertencia del compilador que este no es un método de API.
    • Aquí está la pertinente java doc: docs.oracle.com/javase/9/docs/api/java/util/Set.html. Así como el uso de Java 9+ JDK, usted puede necesitar ajustar su IDE o construir la herramienta a utilizar Java 9 de cumplimiento (por ejemplo, para maven, sería pasos similares a los que aquí, pero 1.9: stackoverflow.com/questions/16798066/…)
    • Ojalá pudiéramos usar Java 9.. estamos viviendo en el pasado! 🙁
    • que es bueno, pero tiene algunas restricciones en el tamaño de los argumentos…
  6. 2

    Aquí un poco del método que se puede utilizar

      /**
       * 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));
      }
  7. 1

    Otra forma de hacerlo usando Java 8 y las enumeraciones sería:

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

    Ver EnumSet.

    Me gustaría recomendar un análisis de rendimiento entre este enfoque y

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

    porque si usted tiene más de cinco elementos, el javadoc del método de los estados que pueden ser problemas de rendimiento como se puede ver en el javadoc de Conjunto.De(E, E…).

Dejar respuesta

Please enter your comment!
Please enter your name here