2010-04-21 14 views
34

In java se eseguo il ciclo su keySet() di un HashMap, come faccio a (all'interno del ciclo), ottenere l'indice numerico di quel tasto?Java: ottieni l'indice della chiave in HashMap?

Fondamentalmente, mentre faccio un giro della mappa, voglio essere in grado di ottenere 0,1,2 ... Immagino che questo sarebbe più pulito di dichiarare un int e incrementare ad ogni iterazione.

Grazie.

+3

Per cosa ti serve? Come accennato nelle risposte, l'ordine in una mappa non è necessariamente costante, può cambiare quando le chiavi vengono aggiunte o rimosse. – extraneon

+5

Ciò che è ancora meglio è che due HashMap uguali possono ancora avere ordinamenti diversi. Possono farlo * anche se hanno la stessa storia di aggiunte/rimuove * (diverse capacità lo farebbero). –

+0

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

risposta

4

In poche parole, le raccolte basate su hash non sono indicizzate, quindi è necessario farlo manualmente.

+0

Qual è la struttura dati consigliata in questo caso? –

18

HashMap non ha un ordine definito di chiavi.

8

Non è possibile - un set non è ordinato, quindi non è fornito alcun indice. Dovrai dichiarare un int, come dici tu. Ricorda che la prossima volta che chiami keySet() non otterrai necessariamente i risultati nello stesso ordine.

+1

Se l'OP vuole * davvero * questo, non è difficile scrivere una collezione supportata da un TreeSet e una Mappa. In questo modo puoi ottenere i risultati sempre nello stesso ordine.Ora come comportarsi quando la Mappa viene modificata durante l'iterazione è fino all'OP ma una struttura dati che è una mappa in cui le chiavi sono in un set ordinato è sicuramente fattibile. (btw sto commentando più la tua risposta che sulla domanda dell'OP). – SyntaxT3rr0r

36

Non so se questo è un qualsiasi "pulito", ma:

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

O allo stesso modo: 'int index = 0; for (Chiave dell'oggetto: map.keySet()) {'Object value = map.get (chiave); ++ indice; } // dang formatting – benjineer

10

Se tutti si sta cercando di fare è ottenere il valore fuori dalla HashMap in sé, si può fare qualcosa di simile al seguente:

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

in alternativa, è possibile eseguire iterazioni sulle voci di una mappa, se questo è ciò che ti interessa:

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

Come una comunità, potremmo essere in grado di darti risposte migliori/più appropriate se avessimo qualche idea del perché avevi bisogno degli indici o di cosa pensavi che gli indici potessero fare per te.

45

Uso LinkedHashMap invece di HashMap Sarà sempre tornare chiavi nello stesso ordine (come inserimento) quando si chiama keySet()

Per maggiori dettagli, si veda Class LinkedHashMap

+0

L'ordine potrebbe non essere importante - potremmo aver bisogno solo di testare la prima o l'ultima coppia di lettura, per esempio. – benjineer

4

Recentemente sono stato l'apprendimento dei concetti alla base HashMap e era chiaro che non c'era un ordine preciso delle chiavi. per scorrere è possibile utilizzare:

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

postando questo come alternativa altrettanto valida per @Binil risposta di Thomas - ha cercato di aggiungerlo come un commento, ma non era convinto della leggibilità di tutto.

int index = 0; 

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

Probabilmente non aiuta il manifesto domanda originale dal momento che questa è la situazione letterale che stavano cercando di evitare, ma può aiutare gli altri alla ricerca di una risposta facile.