2012-02-21 10 views
11

Voglio passare attraverso tutti gli elementi in un dizionario in java. per chiarire quello che voglio fare, questo è il codice C#Ciclo Foreach in java per Dizionario

Dictionary<string, Label> LableList = new Dictionary<string, Label>(); 
foreach (KeyValuePair<string, Label> z in LabelList); 

non so come fare questo è Java, per esempio ho fatto questo

for(Object z: dic) 

ma dice che non è iterabile . Si prega di avvisare ......

risposta

31

Suppongo che tu abbia un Map<String, Label> che è la struttura del dizionario integrato Java. Java non consente di eseguire iterazioni direttamente su un valore Map (ad esempio non implementa Iterable) perché sarebbe ambiguo su cosa si sta effettivamente iterando.

Si tratta semplicemente di scegliere di scorrere le chiavi, i valori o le voci (entrambi).

ad es.

Map<String, Label> map = new HashMap<String, Label>(); 
//... 

for (String key : map.keySet()) { 
} 

for (Label value : map.values()) { 
} 

for (Map.Entry<String, Label> entry : map.entrySet()) { 
    String key = entry.getKey(); 
    Label value = entry.getValue(); 
} 

Il codice C# sembra essere lo stesso di iterare sulle voci (l'ultimo esempio).

+0

Questo è il modo in cui lo definisco: Dizionario dic = null; Non so nulla di Map ... È una specie di dizionario? – Daniel

+3

@Daniel Leggendo il javadoc si direbbe 'NOTA: questa classe è obsoleta. Le nuove implementazioni dovrebbero implementare l'interfaccia Map, piuttosto che estendere questa classe., Quindi dovresti usare una delle nuove classi di mappe. Probabilmente vuoi un 'HashMap' - che implementa anche le nuove funzioni di cui hai bisogno per funzionare in modo iterabile – Voo

+1

Incredibile, avevo dimenticato da tempo che Hashtable aveva una superclasse Dictionary. –

0

La cosa migliore è quella di utilizzare questo:

for (String key : LableList.keys()) { 
    Label value = LableList.get(key); 

    // do what you wish with key and value here 
} 

In Java tuttavia, una scommessa migliore è di non usare dizionario come si farebbe in .NET ma di utilizzare uno dei Mappa sottoclassi, per esempio HashMap. È possibile scorrere uno di questi esempi:

for (Entry<String, Label> e : myMap.entrySet()) { 
    // Do what you wish with e.getKey() and e.getValue() 
} 

Si sconsiglia inoltre l'uso di Dizionario nel javadoc ufficiale.

+1

.keys() restituisce un'Enumerazione che non implementa Iterable e quindi non può essere utilizzata nel ciclo foreach. Il tuo codice non verrà compilato. – Philipp

+0

Dillo al mio codice di lavoro :) –

+0

Quindi il mio compilatore Eclipse è danneggiato (che mostra ed errore), o non stiamo parlando della stessa cosa. (Non che il dizionario sia importante in alcun modo) – Philipp

3

java.util.Map è l'equvivalent Dizionario e sotto è un esempio di come è possibile scorrere ogni voce

for(Map.Entry<K, V> e : map.entrySet()) 
{ 
    System.out.println(e.getKey()+": "+e.getValue()); 
} 
0

stavo cercando di aggiungere il contenuto di una HashMap (a) in un altro HashMap (b).

ho trovato più semplice per iterare attraverso HashMap un questo modo:

a.forEach((k, v) -> b.put(k, v)); 

È possibile manipolare il mio esempio per fare ciò che più desiderate al di là del "->".

Si noti che questa è un'espressione Lambda e che è necessario utilizzare Java 1.8 (Java 8) o successivo per il corretto funzionamento. :-)