Ist es möglich, ein Element von HashMap anhand seiner Position zu erhalten?

Lesezeit: 4 Minuten

Benutzer-Avatar
Eugen

Wie kann man ein Element von HashMap anhand seiner Position abrufen, ist das überhaupt möglich?

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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


Benutzer-Avatar
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]);

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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

1310620cookie-checkIst es möglich, ein Element von HashMap anhand seiner Position zu erhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy