2012-02-21 12 views
11

Chcę przejrzeć wszystkie elementy w słowniku w java. wyjaśnić, co chcę zrobić, to jest kod C#Pętla Foreach w java dla Dictionary

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

nie wiem jak to zrobić, to jest Java, na przykład zrobiłem to

for(Object z: dic) 

ale mówi, że nie jest iterable . Proszę doradzić ......

Odpowiedz

31

Zakładam, że masz Map<String, Label>, która jest wbudowaną strukturą słownika Java. Java nie pozwala na iterację bezpośrednio nad Map (tj. Nie implementuje ona Iterable), ponieważ byłaby niejednoznaczna, co faktycznie jest iterowane.

Jest to tylko kwestia wyboru, aby wykonać iteracje za pomocą klawiszy, wartości lub wpisów (obu).

np.

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(); 
} 

Twój kod C# wydaje się być taki sam jak iteracja nad wpisami (ostatni przykład).

+0

Tak to zdefiniuję: Słownik dic = null; Nie wiem nic o Mapie ... Czy jest to jakiś słownik? – Daniel

+3

@Daniel Czytanie javadoc powie: 'Ta klasa jest przestarzała. Nowe implementacje powinny implementować interfejs Map, zamiast rozszerzać tę klasę. ", Więc powinieneś używać jednej z nowych klas map. Prawdopodobnie chcesz 'HashMap' - który również implementuje nowe funkcje potrzebne do iteracji do pracy – Voo

+1

Niesamowite, już dawno zapomniałem, że Hashtable ma nadrzędną słownikową. –

0

Najprościej jest użyć to:

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

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

W Javie jednak lepszym wyborem jest nie używać słownika, tak jak w .NET, ale na jedną mapę podklasy, np HashMap. Możesz powtórzyć jeden z następujących sposobów:

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

Odradzamy także używanie słownika w oficjalnym języku javadoc.

+1

.keys() zwraca wyliczenie, które nie implementuje Iterable i dlatego nie może być użyte w pętli foreach. Twój kod się nie skompiluje. – Philipp

+0

Powiedz to do mojego działającego kodu :) –

+0

Więc albo mój kompilator Eclipse jest uszkodzony (co pokazuje i błąd), albo nie mówimy o tym samym. (Nie że słownik ma jakiekolwiek znaczenie) – Philipp

3

java.util.Map jest słownik equvivalent i poniżej jest przykładem, w jaki sposób można wykonać iterację każdego wpisu

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

starałem się dodać zawartość jednej HashMap (a) do innego HashMap (b).

znalazłem to proste iterację HashMap w ten sposób:

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

Można manipulować moim przykładem, aby robić to, co kiedykolwiek chcesz na drugą stronę „->”.

Zwróć uwagę, że jest to wyrażenie Lambda i musisz użyć Javy 1.8 (Java 8) lub nowszej, aby to zadziałało. :-)