2009-05-12 10 views
38

Qualcuno può fornire un esempio di creazione di Java ArrayList e HashMap al volo? Quindi, invece di fare un add() o put(), effettivamente fornire i dati seme per l'array/hash all'istanza della classe?Java ArrayList e HashMap al volo

Per fornire un esempio, qualcosa di simile a PHP per esempio:

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

stai chiedendo per la sintassi su come farlo, o di un esempio reale del perché si vorrebbe? –

risposta

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

creazione di una nuova classe senza alcuna funzionalità diversa ... –

+3

Questi approcci sono buoni. Ma i contenuti possono essere modificati dopo la creazione. Gli approcci immutabili sono davvero fantastici! –

+7

questo a volte è pericoloso. otterrete un riferimento alla classe che racchiude poiché la classe interna anonima mantiene un riferimento al suo oggetto padre. questo potrebbe causare problemi con la garbage collection e la serializzazione. –

3

Vuoi dire come questo?

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 siete interessati alla ArrayList costruttore che prende un Collection<? extends E>? Per esempio:

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

Un lieve miglioramento su suggerimento di Jon: funziona per qualsiasi numero di elementi: Lista pubblico BuildList (String ... articoli) { tornare new ArrayList (Arrays.asList (articoli)); } –

+0

(Il codice di esempio potrebbe essere semplificato un po 'facendo uso di varags Arrays.asList(); http://stackoverflow.com/questions/258954/java-out-with-the-old-in-with-the -new/635078 # 635078) – Jonik

+0

Stavo mostrando i passaggi separati per rendere evidente come fare le cose quando avevi già un array. –

27

Un bel modo per farlo è usare Google Collections:

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

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

500kB è un prezzo alto da pagare solo per farlo. Se l'unica cosa desiderata è riempire la Collezione al volo, la risposta accettata è IMHO più bella. –

+0

Un altro motivo per non gradire questo approccio è che si tratta di un elenco immutabile, anche se sto indovinando (senza aver letto la documentazione) che esiste una lista mutabile? – cgp

+0

È immutabile dal design! Ma sì, ci sono anche altre opzioni. Se è immutabile, puoi condividere facilmente un'istanza tra thread e, quindi, tra richieste web. 500 Kb è un prezzo alto da pagare. Ma ci sono così tante altre chicche in Google Collectons, vale la pena pagare il prezzo. –

24

array possono essere convertiti in List s:

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

Si noti che questo non ritorno un ArrayList ma un'istanza arbitraria List (in questo caso è un Array.ArrayList)!

L'approccio di Bruno funziona meglio e potrebbe essere considerato al volo per le mappe. Io preferisco l'altro metodo per le liste però (visto sopra):

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

essere avvisati, Arrays.asList non restituisce un java.util.ArrayList ma un java.util.Arrays $ ArrayList a dimensione fissa! –

7

Utilizzare un bel inizializzatore anonimo:

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

Lo stesso vale per una mappa:

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

Trovo questo il più elegante e leggibile.

Altri metodi richiedono innanzitutto la creazione di un array, quindi la conversione in un elenco, troppo costoso a mio gusto e meno leggibile.

6

per gli elenchi brevi:

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

solo per la lista di dimensioni fisse ... –

+0

non proprio .. da java.util.Arrays.java: public static Lista asList (T ... a) { \t ritorno new ArrayList (a); } quindi restituisce solo un ArrayList pre-inizializzato –

+3

Guardare oltre nella fonte. Le matrici hanno una propria classe ArrayList interna che non supporta add() o remove(). –

3

Per gli elenchi è possibile utilizzare Arrays.asList come questo:

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

per le mappe è possibile utilizzare questo:

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: in Java 9 voi può usare Map.of
Nota 2: Double Brace Initialization per la creazione di HashMaps come suggerito in altre risposte ha caveats