784 votos

¿Cómo inicializar valores de HashSet por construcción?

Necesito crear un Set con valores iniciales.

Set h = new HashSet();
h.add("a");
h.add("b");

¿Hay alguna forma de hacer esto en una sola línea de código? Por ejemplo, es útil para un campo estático final.

1009voto

Gennadiy Puntos 3154

Hay un atajo que uso que no es muy eficiente en términos de tiempo, pero cabe en una sola línea:

Set h = new HashSet<>(Arrays.asList("a", "b"));

Nuevamente, esto no es eficiente en términos de tiempo ya que estás construyendo un array, convirtiéndolo en una lista y utilizando esa lista para crear un conjunto.

Cuando inicializo conjuntos estáticos finales usualmente lo escribo de esta manera:

public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));

Un poco menos feo y la eficiencia no importa para la inicialización estática.

373voto

Bozho Puntos 273663

Las literales de colección estaban programadas para Java 7, pero no llegaron. Así que nada automático aún.

Puedes usar el Sets de guava:

Sets.newHashSet("a", "b", "c")

O puedes usar la siguiente sintaxis, que creará una clase anónima, pero es un poco hacky:

Set h = new HashSet() {{
    add("a");
    add("b");
}};

91voto

coobird Puntos 70356

Hay algunas formas:

Inicialización de doble llave

Esta es una técnica que crea una clase interna anónima con un inicializador de instancia que agrega Strings a sí mismo cuando se crea una instancia:

Set s = new HashSet() {{
    add("a");
    add("b");
}}

Tenga en cuenta que esto realmente creará una nueva subclase de HashSet cada vez que se use, aunque no sea necesario escribir explícitamente una nueva subclase.

Un método de utilidad

Escribir un método que devuelva un Set inicializado con los elementos deseados no es demasiado difícil de escribir:

public static Set newHashSet(String... strings) {
    HashSet set = new HashSet();

    for (String s : strings) {
        set.add(s);
    }
    return set;
}

El código anterior solo permite el uso de un String, pero no debería ser demasiado difícil permitir el uso de cualquier tipo utilizando genéricos.

Usar una biblioteca

Muchas bibliotecas tienen un método de conveniencia para inicializar objetos de colección.

Por ejemplo, Google Collections tiene un Sets.newHashSet(T...) método que poblara un HashSet con elementos de un tipo específico.

29voto

Jason Nichols Puntos 5055

Lo puedes hacer en Java 6:

Set h = new HashSet(Arrays.asList("a", "b", "c"));

¿Pero por qué? No lo encuentro más legible que añadir explícitamente los elementos.

13voto

Mark Elliot Puntos 31871

Una generalización de la función de utilidad de la respuesta de la respuesta de coobird para crear nuevos HashSet:

public static  Set newHashSet(T... objs) {
    Set set = new HashSet();
    for (T o : objs) {
        set.add(o);
    }
    return set;
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X