Wie kann man ein Element von HashMap anhand seiner Position abrufen, ist das überhaupt möglich?
Ist es möglich, ein Element von HashMap anhand seiner Position zu erhalten?
Eugen
Kulnor
Verwenden Sie eine LinkedHashMap, und wenn Sie nach Position abrufen müssen, konvertieren Sie die Werte in eine ArrayList.
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);
-
Wird immer benötigt, um eine Kopie der Schlüssel von HashMap zu instanziieren?
– richardum
13. Juni 2014 um 18:15 Uhr
-
Dadurch wird jedes Mal, wenn wir einen Wert abrufen, ein neues ArrayList-Objekt erstellt, was zu Speicherlecks führt
– NullByte08
2. Juni 2020 um 22:04 Uhr
Wayne
HashMaps Reihenfolge nicht beibehalten:
Diese Klasse gibt keine Garantien bezüglich der Reihenfolge der Karte; insbesondere garantiert sie nicht, dass die Reihenfolge im Laufe der Zeit konstant bleibt.
Schauen Sie sich an LinkedHashMapwas eine vorhersagbare Iterationsreihenfolge garantiert.
-
Das beantwortet die Frage nicht wirklich. Die anderen Antworten unten sind nützlicher.
– forresthopkinsa
24. März 2017 um 21:20 Uhr
-
Mit Respekt zitiert dies eine Dokumentation, die direkt beantwortet die Frage
– Wayne
25. März 2017 um 18:01 Uhr
-
Selbst wenn die Reihenfolge im Laufe der Zeit nicht konstant ist, könnte es dennoch möglich sein, eines der Mitglieder durch eine bestimmte Position abzurufen.
– Anfänger
8. Juni 2017 um 10:09 Uhr
-
Ich folge nicht. Erklären?
– Wayne
8. Juni 2017 um 13:43 Uhr
-
Der HashMap-Link ist defekt/404.
– Raff
23. Januar 2018 um 2:11 Uhr
Sydney Lambert
Wenn Sie die Reihenfolge beibehalten möchten, in der Sie die Elemente zur Karte hinzugefügt haben, verwenden Sie LinkedHashMap
im Gegensatz zu nur HashMap
.
Hier ist ein Ansatz, mit dem Sie einen Wert anhand seines Index in der Karte erhalten können:
public Object getElementByIndex(LinkedHashMap map,int index){
return map.get( (map.keySet().toArray())[ index ] );
}
-
Am einfachsten muss ich sagen … Anstatt alles zu konvertieren, verwenden Sie nur Keyset. Hervorragend
– kirtan403
19. Juli 2016 um 10:30 Uhr
derEdle247
Wenn Sie aus irgendeinem Grund bei der hashMap bleiben 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:
map.get(keys[i]);
ilalex
Verwenden LinkedHashMap
:
Hashtabellen- und Linked-List-Implementierung der Map-Schnittstelle mit vorhersagbarer Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashMap darin, dass sie eine doppelt verknüpfte Liste verwaltet, die alle ihre Einträge durchläuft.
-
Dadurch wird die Reihenfolge beibehalten, aber Sie können immer noch nicht über ihren Index auf Elemente zugreifen. Du müsstest iterieren
– Bozo
8. März 2011 um 19:17 Uhr
-
Dieser Link führt zu einer alten Version der API. Ich würde vorschlagen, eine Verknüpfung zu einer Java 6- oder 7-API herzustellen.
– jzd
8. März 2011 um 19:19 Uhr
Jeff Lee
Verwenden Sie LinkedHashMap und verwenden Sie diese Funktion.
private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
Definiere so und.
private Entry getEntry(int id){
Iterator iterator = map.entrySet().iterator();
int n = 0;
while(iterator.hasNext()){
Entry entry = (Entry) iterator.next();
if(n == id){
return entry;
}
n ++;
}
return null;
}
Die Funktion kann den ausgewählten Eintrag zurückgeben.
-
Dadurch wird die Reihenfolge beibehalten, aber Sie können immer noch nicht über ihren Index auf Elemente zugreifen. Du müsstest iterieren
– Bozo
8. März 2011 um 19:17 Uhr
-
Dieser Link führt zu einer alten Version der API. Ich würde vorschlagen, eine Verknüpfung zu einer Java 6- oder 7-API herzustellen.
– jzd
8. März 2011 um 19:19 Uhr
Vikram Kodag
Standardmäßig unterstützt Java LinkedHasMap das Abrufen von Werten nach Position nicht. Also schlage ich vor, mit angepasst zu gehen IndexedLinkedHashMap
public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private ArrayList<K> keysList = new ArrayList<>();
public void add(K key, V val) {
super.put(key, val);
keysList.add(key);
}
public void update(K key, V val) {
super.put(key, val);
}
public void removeItemByKey(K key) {
super.remove(key);
keysList.remove(key);
}
public void removeItemByIndex(int index) {
super.remove(keysList.get(index));
keysList.remove(index);
}
public V getItemByIndex(int i) {
return (V) super.get(keysList.get(i));
}
public int getIndexByKey(K key) {
return keysList.indexOf(key);
}
}
Dann können Sie diese angepasste LinkedHasMap als verwenden
IndexedLinkedHashMap<String,UserModel> indexedLinkedHashMap=new IndexedLinkedHashMap<>();
Werte hinzufügen
indexedLinkedHashMap.add("key1",UserModel);
GetValue nach Index
indexedLinkedHashMap.getItemByIndex(position);
-
Können Sie mir sagen, wie ich die Liste umkehren kann? wie wir es in Collections.reverse(List) verwenden
– Lakpriya Senevirathna
2. September 2021 um 11:38 Uhr
Was meinst du mit “Stellung”? HashMaps sind nicht geordnet, also haben sie nicht die übliche Vorstellung von “Position”, die Sie mit so etwas wie einem Vektor erhalten würden.
– Matte
8. März 2011 um 19:15 Uhr
Meinen Sie mit der Insertionsreihenfolge oder einer anderen Reihenfolge?
– Markus Elliot
8. März 2011 um 19:16 Uhr