Was meinst du mit "Position"? HashMaps werden nicht bestellt, daher haben sie nicht die übliche Vorstellung von "Position", die Sie mit so etwas wie einem Vektor erhalten würden.
Mat
1
Meinen Sie damit die Einfügereihenfolge oder eine andere Reihenfolge?
Diese Klasse übernimmt keine Garantie für die Reihenfolge der Karte. Insbesondere kann nicht garantiert werden, dass die Bestellung über die Zeit konstant bleibt.
Schauen Sie sich LinkedHashMap an , das eine vorhersehbare Iterationsreihenfolge garantiert.
Dies beantwortet die Frage nicht wirklich. Die anderen Antworten unten sind nützlicher.
Forresthopkinsa
6
In Bezug auf diese zitiert Dokumentation, die die Frage direkt beantwortet
Wayne
1
Selbst wenn die Reihenfolge über die Zeit nicht konstant ist, kann es dennoch möglich sein, eines der Mitglieder an einer bestimmten Position abzurufen.
Anfänger
Ich folge nicht. Erklären?
Wayne
Die HashMap-Verbindung ist unterbrochen / 404.
Raf
109
Verwenden Sie eine LinkedHashMap und konvertieren Sie die Werte in eine ArrayList, wenn Sie sie nach Position abrufen müssen.
LinkedHashMap<String,String> linkedHashMap =newLinkedHashMap<String,String>();/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");/* Get by position */int pos =1;String value =(newArrayList<String>(linkedHashMap.values())).get(pos);
Wird immer benötigt, um eine Kopie der Schlüssel von HashMap zu instanziieren?
Richard
Dadurch wird jedes Mal, wenn wir einen Wert abrufen, ein neues ArrayList-Objekt erstellt, was zu Speicherlecks führt
NullByte08
48
Wenn Sie die Reihenfolge beibehalten möchten, in der Sie die Elemente zur Karte hinzugefügt haben, verwenden Sie LinkedHashMapim Gegensatz zu nur HashMap.
Hier ist ein Ansatz, mit dem Sie einen Wert anhand seines Index in der Karte ermitteln können:
publicObject getElementByIndex(LinkedHashMap map,int index){return map.get((map.keySet().toArray())[ index ]);}
Am einfachsten muss ich sagen ... Anstatt alles zu konvertieren, verwenden Sie nur das Keyset. Superb
kirtan403
19
Wenn Sie sich aus irgendeinem Grund an die HashMap halten müssen, können Sie das keySet in ein Array konvertieren und die Schlüssel im Array indizieren, um die Werte in der Map wie folgt zu erhalten:
Object[] keys = map.keySet().toArray();
Sie können dann wie folgt auf die Karte zugreifen:
Implementierung der Hash-Tabelle und der verknüpften Liste der Map-Schnittstelle mit vorhersagbarer Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashMap dadurch, dass eine doppelt verknüpfte Liste geführt wird, die alle Einträge durchläuft.
Ich gehe davon aus, dass Sie sich mit 'Position' auf die Reihenfolge beziehen, in der Sie die Elemente in die HashMap eingefügt haben. In diesem Fall möchten Sie eine LinkedHashMap verwenden. Die LinkedHashMap bietet jedoch keine Zugriffsmethode. Sie müssen eine wie schreiben
Ein anderer Arbeitsansatz besteht darin, Kartenwerte in ein Array umzuwandeln und dann das Element am Index abzurufen. Der Testlauf von 100 000 Elementen durch Indexsuche in LinkedHashMap von 100 000 Objekten unter Verwendung der folgenden Ansätze führte zu folgenden Ergebnissen:
//My answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.values().toArray(newParticle[map.values().size()])[index];}//68 965 ms//Syd Lambert's answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.get((map.keySet().toArray())[ index ]);}//80 700 ms
Alles in allem scheint das Abrufen von Elementen per Index aus LinkedHashMap eine ziemlich schwere Operation zu sein.
HashMap - und die zugrunde liegende Datenstruktur - Hash-Tabellen haben keine Vorstellung von Position. Im Gegensatz zu einer LinkedList oder einem Vektor wird der Eingabeschlüssel in einen 'Bucket' umgewandelt, in dem der Wert gespeichert wird. Diese Buckets sind nicht in einer Weise angeordnet, die außerhalb der HashMap-Schnittstelle sinnvoll ist. Daher sind die Elemente, die Sie in die HashMap einfügen, nicht in dem Sinne angeordnet, wie Sie es von den anderen Datenstrukturen erwarten würden
HashMap hat kein Positionskonzept, daher gibt es keine Möglichkeit, ein Objekt nach Position zu ermitteln. Objekte in Karten werden gesetzt und über Schlüssel abgerufen.
Standardmäßig unterstützt Java LinkedHasMap das Abrufen von Werten nach Position nicht. Also schlage ich vor, mit maßgeschneiderten zu gehenIndexedLinkedHashMap
publicclassIndexedLinkedHashMap<K, V>extendsLinkedHashMap<K, V>{privateArrayList<K> keysList =newArrayList<>();publicvoid add(K key, V val){super.put(key, val);
keysList.add(key);}publicvoid update(K key, V val){super.put(key, val);}publicvoid removeItemByKey(K key){super.remove(key);
keysList.remove(key);}publicvoid removeItemByIndex(int index){super.remove(keysList.get(index));
keysList.remove(index);}public V getItemByIndex(int i){return(V)super.get(keysList.get(i));}publicint getIndexByKey(K key){return keysList.indexOf(key);}}
Dann können Sie diese angepasste LinkedHasMap als verwenden
HashMaps erlauben keinen Zugriff nach Position, kennen nur den Hash-Code und können den Wert abrufen, wenn sie den Hash-Code des Schlüssels berechnen können. TreeMaps haben einen Begriff der Bestellung. Linkedhas-Karten behalten die Reihenfolge bei, in der sie in die Karte eingegeben wurden.
Antworten:
HashMaps behält die Reihenfolge nicht bei:
Schauen Sie sich LinkedHashMap an , das eine vorhersehbare Iterationsreihenfolge garantiert.
quelle
Verwenden Sie eine LinkedHashMap und konvertieren Sie die Werte in eine ArrayList, wenn Sie sie nach Position abrufen müssen.
quelle
Wenn Sie die Reihenfolge beibehalten möchten, in der Sie die Elemente zur Karte hinzugefügt haben, verwenden Sie
LinkedHashMap
im Gegensatz zu nurHashMap
.Hier ist ein Ansatz, mit dem Sie einen Wert anhand seines Index in der Karte ermitteln können:
quelle
Wenn Sie sich aus irgendeinem Grund an die HashMap halten müssen, können Sie das keySet in ein Array konvertieren und die Schlüssel im Array indizieren, um die Werte in der Map wie folgt zu erhalten:
Sie können dann wie folgt auf die Karte zugreifen:
quelle
String myKey = keys[i].toString();
Verwendung
LinkedHashMap
:quelle
Verwenden Sie LinkedHashMap und verwenden Sie diese Funktion.
Definieren Sie so und.
Die Funktion kann den ausgewählten Eintrag zurückgeben.
quelle
Ich gehe davon aus, dass Sie sich mit 'Position' auf die Reihenfolge beziehen, in der Sie die Elemente in die HashMap eingefügt haben. In diesem Fall möchten Sie eine LinkedHashMap verwenden. Die LinkedHashMap bietet jedoch keine Zugriffsmethode. Sie müssen eine wie schreiben
quelle
Ein anderer Arbeitsansatz besteht darin, Kartenwerte in ein Array umzuwandeln und dann das Element am Index abzurufen. Der Testlauf von 100 000 Elementen durch Indexsuche in LinkedHashMap von 100 000 Objekten unter Verwendung der folgenden Ansätze führte zu folgenden Ergebnissen:
Alles in allem scheint das Abrufen von Elementen per Index aus LinkedHashMap eine ziemlich schwere Operation zu sein.
quelle
HashMap - und die zugrunde liegende Datenstruktur - Hash-Tabellen haben keine Vorstellung von Position. Im Gegensatz zu einer LinkedList oder einem Vektor wird der Eingabeschlüssel in einen 'Bucket' umgewandelt, in dem der Wert gespeichert wird. Diese Buckets sind nicht in einer Weise angeordnet, die außerhalb der HashMap-Schnittstelle sinnvoll ist. Daher sind die Elemente, die Sie in die HashMap einfügen, nicht in dem Sinne angeordnet, wie Sie es von den anderen Datenstrukturen erwarten würden
quelle
HashMap hat kein Positionskonzept, daher gibt es keine Möglichkeit, ein Objekt nach Position zu ermitteln. Objekte in Karten werden gesetzt und über Schlüssel abgerufen.
quelle
Sie können den folgenden Code verwenden, um den Schlüssel zu erhalten:
String [] keys = (String[]) item.keySet().toArray(new String[0]);
und erhalten Sie ein Objekt oder eine Liste, die mit dem Schlüssel dieses Elements wie folgt in HashMap eingefügt werden:
item.get(keys[position]);
quelle
Standardmäßig unterstützt Java LinkedHasMap das Abrufen von Werten nach Position nicht. Also schlage ich vor, mit maßgeschneiderten zu gehen
IndexedLinkedHashMap
Dann können Sie diese angepasste LinkedHasMap als verwenden
Werte hinzufügen
Um den Wert nach Index zu erhalten
quelle
HashMaps erlauben keinen Zugriff nach Position, kennen nur den Hash-Code und können den Wert abrufen, wenn sie den Hash-Code des Schlüssels berechnen können. TreeMaps haben einen Begriff der Bestellung. Linkedhas-Karten behalten die Reihenfolge bei, in der sie in die Karte eingegeben wurden.
quelle
Sie können versuchen, so etwas zu implementieren. Schauen Sie sich Folgendes an:
Ich hoffe das funktioniert bei dir.
quelle