2010-04-21 11 views
34

in Java, wenn ich über die keySet() ein HashMap bin Looping, wie kann ich (in der Schleife), den numerischen Index dieses Schlüssels?Java - Get Index des Schlüssels in HashMap?

Grundsätzlich, wie ich durch die Karte durchlaufen, möchte ich in der Lage sein, 0,1,2 zu erhalten ... Ich denke, das wäre sauberer als deklariert eine int und inkrementieren mit jeder Iteration.

Danke.

+3

Wozu brauchst du es? Wie in den Antworten erwähnt, ist die Reihenfolge in einer Karte nicht unbedingt konstant, sie kann sich ändern, wenn Schlüssel hinzugefügt oder entfernt werden. – extraneon

+5

Noch besser ist, dass zwei gleiche HashMaps unterschiedliche Ordnungen haben können. Sie können es * tun, auch wenn sie die gleiche Geschichte von adds/removes * haben (verschiedene Kapazitäten würden es tun). –

+0

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

Antwort

4

Einfach ausgedrückt, Hash-basierte Sammlungen indiziert sind nicht so Sie es manuell zu tun haben.

+0

Was die empfohlene Datenstruktur ist in diesem Fall? –

18

Die HashMap hat keine definierte Anordnung der Tasten.

8

Sie können nicht - ein Satz ist ungeordnet, so gibt es keinen Index zur Verfügung gestellt. Sie müssen einen int deklarieren, wie Sie sagen. Denken Sie daran, dass Sie beim nächsten Aufruf von keySet() nicht unbedingt die Ergebnisse in der gleichen Reihenfolge erhalten.

+1

Wenn das OP dies wirklich will, ist es nicht schwer, eine Sammlung zu schreiben, die von einem TreeSet und einer Map unterstützt wird. Auf diese Weise können Sie die Ergebnisse immer in der gleichen Reihenfolge erhalten.Wie man sich verhalten soll, wenn die Map während der Iteration geändert wird, ist dem OP überlassen, aber eine Datenstruktur, bei der es sich um eine Map handelt, bei der sich die Schlüssel in einer geordneten Menge befinden, ist definitiv machbar. (Ich komme eher auf Ihre Antwort als auf die Frage des OP). – SyntaxT3rr0r

36

nicht sicher, ob dies irgendwelche „sauberer“, aber:

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

Oder ähnlich: 'int index = 0; for (Objektschlüssel: map.keySet()) {'Objektwert = map.get (key); ++ Index; } // dang-Formatierung – benjineer

10

Wenn alles, was Sie zu tun versuchen, den Wert aus dem hashmap selbst ist, können Sie so etwas wie das folgende tun:

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

Oder Sie können die Einträge einer Karte iterieren, wenn es das ist, was Sie interessiert sind:

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

Wie Wenn wir eine Idee haben, warum Sie die Indizes benötigen oder was die Indizes Ihrer Meinung nach für Sie tun könnten, könnten wir Ihnen vielleicht bessere/geeignetere Antworten geben.

45

Verwenden LinkedHashMap statt HashMap Es wird immer Schlüssel in derselben Reihenfolge zurückkehren (als Insertion) beim Aufruf keySet()

Weitere Einzelheiten finden Sie Class LinkedHashMap

+0

Die Reihenfolge ist möglicherweise nicht wichtig - wir müssen zum Beispiel nur das erste oder letzte gelesene Paar testen. – benjineer

4

ich vor kurzem wurde die Konzepte hinter HashMap Lernen und Es war klar, dass es keine bestimmte Reihenfolge der Schlüssel gab. iterieren Sie verwenden können:

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

dieses Posting als eine ebenso sinnvolle Alternative Thomas Antwort auf @Binil - versuchte es als Kommentar zu schreiben, wurde aber von der Lesbarkeit des Ganzen nicht überzeugt.

int index = 0; 

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

Wahrscheinlich hilft nicht, das ursprüngliche Plakat Frage, da dies die wörtliche Situation zu vermeiden, sie versuchten, kann aber anderer Benutzer für eine einfache Antwort helfen.

Verwandte Themen