2010-04-21 16 views
34

W java, jeśli zapętlałem się nad keySet() z HashMap, w jaki sposób (w pętli) uzyskać numeryczny indeks tego klucza?Java - pobierz indeks klucza w HashMap?

Zasadniczo, gdy przeglądam mapę, chcę uzyskać 0,1,2 ... Uważam, że byłoby to czystsze niż deklarowanie int i inkrementowanie w każdej iteracji.

Dzięki.

+3

Do czego jest to potrzebne? Jak wspomniano w odpowiedziach, kolejność na mapie niekoniecznie jest stała, może się zmieniać, gdy klucze zostaną dodane lub usunięte. – extraneon

+5

Co jeszcze lepsze jest to, że dwie mapy HashMaps, które są równe, mogą nadal mieć różne porządki. Mogą to zrobić * nawet jeśli mają taką samą historię dodawania/usuwania * (mogą to robić różne pojemności). –

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 –

Odpowiedz

4

Po prostu, zbiory hash nie są indeksowane, więc musisz to zrobić ręcznie.

+0

Jaka jest zalecana struktura danych w tym przypadku? –

18

HashMap nie ma zdefiniowanej kolejności klawiszy.

8

Nie można - zestaw jest nieuporządkowany, więc nie ma podanego indeksu. Będziesz musiał zadeklarować int, jak mówisz. Pamiętaj tylko, że przy następnym wywołaniu metody keySet() niekoniecznie uzyskasz wyniki w tej samej kolejności.

+1

Jeśli program operacyjny naprawdę * chce * to, nie jest trudno napisać kolekcję popartą przez TreeSet i Mapę. W ten sposób możesz uzyskać wyniki zawsze w tej samej kolejności.Teraz, jak zachować się, gdy mapa jest modyfikowana podczas iteracji, zależy od OP, ale struktura danych, która jest mapą, w której klucze są w uporządkowanym zestawie, jest zdecydowanie wykonalna. (przy okazji bardziej komentuję twoją odpowiedź niż na pytanie OP). – SyntaxT3rr0r

36

Nie wiem, czy to jest jakaś „czystsze”, ale:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

Lub podobnie: 'int index = 0; for (Object key: map.keySet()) {'Wartość obiektu = map.get (klucz); ++ indeks; } // formatowanie dang – benjineer

10

Jeśli wszystko próbują zrobić to uzyskać wartość z samego hashmap, można zrobić coś jak następuje:

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    //TODO: this 
} 

Albo można iteracyjne nad wpisów z mapy, jeśli to, co Cię interesuje:

for (Map.Entry<Object, Object> entry : map.entrySet()) { 
    Object key = entry.getKey(); 
    Object value = entry.getValue(); 
    //TODO: other cool stuff 
} 

As społeczność, być może będziemy w stanie udzielić ci lepszych/bardziej odpowiednich odpowiedzi, jeśli będziemy mieli jakiś pomysł, dlaczego potrzebne są indeksy lub co myślisz, że indeksy mogą zrobić dla ciebie.

45

Zastosowanie LinkedHashMap zamiast HashMap Będzie on zawsze zwraca klucze w tej samej kolejności (jak wstawiania), gdy dzwoni Keyset()

Aby uzyskać więcej szczegółów, patrz Class LinkedHashMap

+0

Zamówienie może nie być ważne - możemy na przykład przetestować tylko pierwszą lub ostatnią parę odczytaną. – benjineer

4

Byłem niedawno nauki Koncepcje HashMap i było jasne, że nie ma określonej kolejności kluczy. iteracyjne można użyć:

Hashmap<String,Integer> hs=new Hashmap(); 
for(Map.Entry<String, Integer> entry : hs.entrySet()){ 
     String key=entry.getKey(); 
     int val=entry.getValue(); 
     //your code block 
    } 
2

Delegowanie to jako równie realną alternatywą dla @Binil odpowiedź Thomasa - starał się go dodać jako komentarz, ale nie był przekonany o czytelność tego wszystkiego.

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

Prawdopodobnie nie pomaga pierwotnego pytania plakat ponieważ jest to dosłowne sytuacja starali się uniknąć, ale może pomóc innym szukają łatwej odpowiedzi.