2012-06-22 5 views
14

Ich habe eine TreeMap mit einer Reihe von "Key and Value" -Paare. Wie kann ich Schlüssel und Wert an einem bestimmten Index der TreeMap erhalten?So erhalten Sie Schlüssel und Wert einer TreeMap bei bestimmten Index

EDIT: @ TO-ALL: Danke. Aber ich weiß, wie man es implementiert, indem man eine zusätzliche ArrayList verwendet. Ich dachte nur, dass es irgendeinen Weg gibt, dies zu erreichen, ohne eine zusätzliche ArrayList zu verwenden.

+2

Warum Sie das tun wollen? Indizes sind innerhalb der TreeMap-Implementierung intern. Du solltest sie nicht benutzen. Sie sollten sich immer nur auf die Methoden 'keys()', 'values ​​()' und 'get (key)' verlassen. –

+1

Es ist ziemlich absichtlich, dass Sie das nicht tun können, außer indem Sie in linearer Zeit nur das "entrySet" durchlaufen. –

+0

Ich entwickle eine Musik-Anwendung und muss Albuminame in Schlüssel und Albumid in Wert speichern. Die Situation ist so, dass ich sowohl Schlüssel als auch Wert habe. Ich kann meine Aufgabe mit einer zusätzlichen ArrayList erreichen, möchte sie aber einfach implementieren. –

Antwort

2

Dies ist möglicherweise nicht der beste Weg, aber Sie können auf Ihren Schlüssel/Wert in einem bestimmten Index zugreifen.

TreeMap<Object, Object> foo = new TreeMap<Object, Object>(); 
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX]; 
Object value = foo.get(key); 
19

Wenn Sie wirklich TreeMap und von Position bekommen verwenden möchten, können Sie die folgende verwenden:

key => treemap.keySet().toArray()[0] 
value => treemap.get(key); 

OR (wenn Sie nur Wert wollen)

treemap.values().toArray()[0]; 

Aber ich würde Ich schlage vor, Sie verwenden Iterator, wie in der obigen Methode, es muss Array erstellen, wann immer Sie wollen (so nicht so effizient) und auch sollten Sie vorsichtig genug sein, um sicherzustellen, dass Index nicht außer Reichweite geraten.

+0

abzurufen. Ich erstelle dieses Array nur einmal beim Start und behalte es dann als Look-Up-Tabelle.Hier ist ein Beispiel für ein typisiertes Array 'myMap.keySet(). ToArray (new Integer [0]);' Danke! – gnB

3

Sie können Eintragssatz in einer Array-Liste kopieren und dann durch den Index gewünschten Eintrag erhalten:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet()); 
Map.Entry<K,V>=list.get(index); 

Aber a) Kopieren dauert O (N) Zeit und b) wenn TreeMap ändert, wird die Liste ungültig.

5

Zunächst einmal bin ich mir nicht sicher, warum sich die Leute hier so häufig um die Gültigkeit einer Frage kümmern. Es gibt zahlreiche Fälle, in denen Menschen eine ArrayList in einer sortierten Reihenfolge erhalten haben. Das Verwalten einer ArrayList in sortierter Reihenfolge ist für große Listen ineffizient.

Die Eingabeknoten der Standard-Java (Oracle) Quellenverteilung halten nicht die Größe ihrer Nachkommen Bäume. Aus diesem Grund ist es nicht möglich, ein Element innerhalb der Karte anhand des Index ohne ineffiziente sequenzielle Suche zu identifizieren.

Ich finde dieses Manko so stark, dass ich meine eigene AVL Karte geschrieben haben, die effizient Elemente von Index erhalten und berechnen indexOf (E). Dies zu ermöglichen ist so einfach wie die Größe der linken und rechten Zweige eines Eintrags beizubehalten. Es besteht die Möglichkeit, dass die Glazedlists-Bibliothek über einen durchsuchbaren Baum verfügt, in den sie eingebettet ist. Vielleicht möchten Sie das überprüfen.

-2

hier ist eine andere Möglichkeit, den Schlüssel von einem Wert zu erhalten:

Map<String, String> map = new HashMap<String, String>(); 
map.put("s1", "s1Val"); 
map.put("s2", "s2Val"); 
map.put("s3", "s3Val"); 

    // ex: "s2Val" -> return "s2" 

int index = new ArrayList<String>(map.values()).indexOf("s2Val"); 
System.out.println(map.keySet().toArray()[index]); // -> return "s2" 
+0

unabhängig von der Frage OP gefragt. Auch "Map" garantiert keine Bestellung – frugalcoder

0

Dies kann hilfreich sein

TreeMap< String,Integer > ht=new TreeMap<>(); 

ht.put("12",1); 
ht.put("22",2); 
ht.put("32",3); 
ht.put("42",4); 
for(int i=0;i<ht.size();i++) 
{ 
    System.out.println(new Vector(ht.keySet()).get(i)); 
    System.out.println(new Vector(ht.values()).get(i)); 
}