2009-05-12 12 views
38

¿Puede alguien dar un ejemplo de cómo crear un Java ArrayList y HashMap sobre la marcha? Entonces, ¿en lugar de hacer un add() o put(), realmente suministrando los datos iniciales para la matriz/hash en la creación de instancias de clase?Java ArrayList y HashMap sobre la marcha

Para dar un ejemplo, algo similar a PHP por ejemplo:

$array = array (3, 1, 2); 
$assoc_array = array('key' => 'value'); 
+0

¿Usted está pidiendo la sintaxis sobre la manera de hacer eso, o un ejemplo del mundo real de por qué usted quiere? –

Respuesta

82
List<String> list = new ArrayList<String>() { 
{ 
    add("value1"); 
    add("value2"); 
} 
}; 

Map<String,String> map = new HashMap<String,String>() { 
{ 
    put("key1", "value1"); 
    put("key2", "value2"); 
} 
}; 
+3

creando una nueva clase sin ninguna funcionalidad diferente ... –

+3

Estos enfoques son buenos. Pero los contenidos se pueden modificar después de la creación. ¡Los acercamientos inmutables son muuuuuuuuuy bonitos! –

+7

esto a veces es peligroso. obtendrá una referencia a la clase adjunta, ya que la clase interna anónima mantiene una referencia a su objeto principal. esto puede causar problemas con la recolección de basura y la serialización. –

3

Te refieres a esto?

public List<String> buildList(String first, String second) 
{ 
    List<String> ret = new ArrayList<String>(); 
    ret.add(first); 
    ret.add(second); 
    return ret; 
} 

... 

List<String> names = buildList("Jon", "Marc"); 

O usted está interesado en el constructor que toma un ArrayListCollection<? extends E>? Por ejemplo:

String[] items = new String[] { "First", "Second", "Third" }; 
// Here's one way of creating a List... 
Collection<String> itemCollection = Arrays.asList(items); 
// And here's another 
ArrayList<String> itemList = new ArrayList<String>(itemCollection); 
+0

una ligera mejora en la sugerencia de Jon: funciona para cualquier número de elementos: Lista pública buildList (String ... artículos) {return new ArrayList (Arrays.asList (material)); } –

+0

(El código de ejemplo podría simplificarse un poco haciendo uso de varags Arrays.asList(); http://stackoverflow.com/questions/258954/java-out-with-the-old-in-with-the -new/635078 # 635078) – Jonik

+0

Estaba mostrando los pasos por separado para que sea obvio cómo hacer las cosas cuando ya tienes una matriz. –

27

Una buena manera de hacer esto es mediante Google Collections:

List<String> list = ImmutableList.of("A", "B", "C"); 

Map<Integer, String> map = ImmutableMap.of(
    1, "A", 
    2, "B", 
    3, "C"); 
+2

500kB es un alto precio a pagar solo por hacer eso. Si lo único que desea es llenar la colección sobre la marcha, la respuesta aceptada es en mi humilde opinión. –

+0

Otra razón para disgustarme con este enfoque es que es una lista inmutable, aunque supongo (sin haber leído la documentación) que hay una lista mutable. – cgp

+0

¡Es inmutable por diseño! Pero sí, también hay otras opciones. Si es inmutable, puede compartir fácilmente una instancia entre hilos y, por lo tanto, entre solicitudes web. 500 Kb es un alto precio a pagar. Pero hay muchos otros artículos en Google Collectons, vale la pena pagar el precio. –

24

Las matrices pueden ser convertidos a List s:

List<String> al = Arrays.asList("vote", "for", "me"); //pandering 

en cuenta que esto no retorno un ArrayList pero una instancia arbitraria List (en este caso es un Array.ArrayList)!

El enfoque de Bruno funciona mejor y podría considerarse sobre la marcha para mapas. Yo prefiero el otro método para las listas, aunque (ver más arriba):

Map<String,String> map = new HashMap<String,String>() { 
{ 
    put("key1", "value1"); 
    put("key2", "value2"); 
} 
}; 
+6

tenga cuidado, Arrays.asList no devuelve una java.util.ArrayList sino una java.util.Arrays $ ArrayList de tamaño fijo. –

7

Utilice un buen inicializador anónima:

List<String> list = new ArrayList<String>() {{ 
    add("a"); 
    add("b"); 
}}; 

Lo mismo sucede con un mapa:

Map<String, String> map = new HashMap<String, String>() {{ 
    put("a", "a"); 
    put("b", "b"); 
}}; 

Me parece la más elegante y legible

Otros métodos exigen primero la creación de una matriz y luego convertirla en una lista: demasiado cara y menos legible.

6

de ternas:

List<String> ab = Arrays.asList("a","b"); 
+2

sólo para la lista de tamaño fijo ... –

+0

en realidad no .. de java.util.Arrays.java: pública estática Lista asList (T ... a) { \t retorno new ArrayList (a); } por lo que solo devuelve un ArrayList preinicializado –

+3

Busque más en la fuente. Array tiene su propia clase ArrayList interna que no admite add() o remove(). –

3

Para listas puede utilizar Arrays.asList así:

List<String> stringList = Arrays.asList("one", "two"); 
List<Integer> intList = Arrays.asList(1, 2); 

para Mapas podría utilizar esto:

public static <K, V> Map<K, V> mapOf(Object... keyValues) { 
    Map<K, V> map = new HashMap<>(); 

    K key = null; 
    for (int index = 0; index < keyValues.length; index++) { 
     if (index % 2 == 0) { 
      key = (K)keyValues[index]; 
     } 
     else { 
      map.put(key, (V)keyValues[index]); 
     } 
    } 

    return map; 
} 

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2"); 
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2"); 

Nota: en Java 9 usted puede utilizar Map.of
Nota 2: Double Brace Initialization para crear HashMaps como se sugiere en otras respuestas tiene que caveats

Cuestiones relacionadas