HashMap - Erhalten des First Key-Werts


128

Nachfolgend sind die in der HashMap enthaltenen Werte aufgeführt

statusName {Active=33, Renewals Completed=3, Application=15}

Java-Code zum Abrufen des ersten Schlüssels (dh Aktiv)

Object myKey = statusName.keySet().toArray()[0];

Wie können wir den ersten Schlüssel "Wert" (dh 33) sammeln? Ich möchte sowohl den "Schlüssel" als auch den "Wert" in einer separaten Variablen speichern.


9
Sie stellen fest, dass die HashMapEinträge ungeordnet sind und sich "first" ändern kann, wenn Sie die Karte ändern?
NPE

1
Verstehst du, dass es in einer keine bestimmte Reihenfolge gibt HashMap? Wenn Sie es überhaupt ändern, erhalten Sie die Ergebnisse möglicherweise in einer völlig anderen Reihenfolge.
Jon Skeet

Nein, die Reihenfolge ist nicht von Lauf zu Lauf garantiert, aber innerhalb desselben Threads kann man sich auf die Reihenfolge verlassen.
HD1

1
@ JonSkeet Eigentlich ist das eine wirklich gültige Frage. In Groovy gibt es viele Fälle, in denen Sie eine Struktur zurückerhalten, die wie eine Liste von Karten aussieht, wobei jede Karte einen einzelnen Eintrag enthält. Bisher habe ich keine einfache / offensichtliche (Groovy) Möglichkeit gefunden, alle Werte auszudrucken. Wenn die Schlüssel konstant sind, ist es so einfach wie collection.each {println it.key}, jeden Wert auszudrucken, aber ohne konstante Schlüssel ist es nicht offensichtlich, aber collection.each {println it.values ​​() [0]} funktioniert ( Eine Verfeinerung einiger Antworten hier ...).
Bill K

@ BillK: Wenn Sie wissen, dass jede Karte genau einen Eintrag hat, dann ist das wirklich eine andere Frage, und eine, die sinnvoller ist.
Jon Skeet

Antworten:


249

Sie können dies versuchen:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

Beachten Sie, HashMapgarantiert nicht die Einfügereihenfolge. Verwenden Sie a LinkedHashMap, um die Bestellung intakt zu halten.

Z.B:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

Ausgabe:

 Active
 33

Ich weiß, dass dies eine sehr alte Antwort ist. Dies funktioniert für Hashmaps mit Schlüssel und Wert als Zeichenfolgen. aber wenn com.google.gson.internal.LinkedTreeMap cannot be cast to...ich das gleiche mit Objekt für einen Wert versuche, der einen Casting-Fehler erhält: ... meine Klasse, die ich anstelle der Stringam richtigen Ort angegeben habe ... kann online keine Antwort finden ... Hilfe
Blue Bot

@darthydarth Sie sollten den richtigen Typ verwenden, der auf Ihrem Kontext basiert.
Ruchira Gayan Ranaweera

erstmal super danke fürs antworten! Ich habe es nicht erwartet ... Zweitens habe ich festgestellt, dass es ein Problem mit Generika gibt, die nicht zur Laufzeit gespeichert wurden. Schließlich habe ich es gehackt, indem ich es verwendet habe Gson, um ein Wertobjekt in ein zu konvertieren Stringund es dann wieder in meinen Klassentyp zu analysieren. Es ist hässlich, aber ich konnte wirklich keine andere Lösung für etwas finden, das in anderen Sprachen so einfach zu machen ist (ich lerne jetzt Java)
Blue Bot

sicher aber wie? Es ist zu viel für den Kommentarbereich
Blue Bot

@darthydarth können Sie mir eine E-Mail senden. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

So erhalten Sie den "ersten" Wert:

map.values().toArray()[0]

So erhalten Sie den Wert des "ersten" Schlüssels:

map.get(map.keySet().toArray()[0])

Hinweis: Der obige Code wurde getestet und funktioniert.

Ich sage "zuerst", weil HashMap-Einträge nicht bestellt werden.

Eine LinkedHashMap iteriert ihre Einträge jedoch in derselben Reihenfolge, in der sie eingefügt wurden. Sie können diese für Ihre Map-Implementierung verwenden, wenn die Einfügereihenfolge wichtig ist.


Sie müssen zuerst überprüfen, ob die Karte nicht leer ist
ACV

48

Java 8 Art zu tun,

String firstKey = map.keySet().stream().findFirst().get();


Wenn wir den Schlüssel haben, rufen Sie den ersten Wert mit map.get (firstKey) ab. Nur ein Hinweis. :)
Upen

7

Sie können dies auch versuchen, um den gesamten ersten Eintrag zu erhalten.

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

Dies, um nur den Schlüssel des ersten Eintrags zu erhalten,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

Dies, um nur den Wert des ersten Eintrags zu erhalten,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

Wenn Sie wissen, was Sie tun und das zweite (gleiche für das dritte usw.) Element einer Karte erhalten möchten, sollten Sie dies versuchen:

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

4

Wie können wir den ersten Schlüssel "Wert" sammeln (dh 33)?

Mit verwenden youMap.get(keyYouHave)können Sie den Wert davon erhalten.

Ich möchte sowohl den "Schlüssel" als auch den "Wert" in einer separaten Variablen speichern

Ja, das können Sie einer Variablen zuordnen.

Warten Sie ......... es ist noch nicht vorbei.

Wenn Sie (Geschäftslogik) von der Reihenfolge des Einfügens und Abrufens abhängen, werden Sie seltsame Ergebnisse sehen. Karte ist nicht bestellt, sie werden nicht in einer Bestellung gespeichert. Bitte beachten Sie diese Tatsache. Verwenden Sie eine Alternative, um Ihre Bestellung zu erhalten. Wahrscheinlich einLinkedHashMap


2

Beachten Sie, dass Sie beachten sollten, dass Ihr Logikfluss niemals auf den Zugriff auf die HashMapElemente in einer bestimmten Reihenfolge angewiesen sein darf. Einfach ausgedrückt, weil HashMaps nicht geordnet sind Collectionund dies nicht das Ziel ist. (Weitere Informationen zu geordneten und sortierten Sammlungen finden Sie in diesem Beitrag. )

Zurück zum Beitrag, Sie haben bereits die Hälfte der Arbeit erledigt, indem Sie den ersten Elementschlüssel geladen haben:

Object myKey = statusName.keySet().toArray()[0];

Rufen Sie einfach map.get(key)an, um den entsprechenden Wert zu erhalten:

Object myValue = statusName.get(myKey);

1

Denken Sie daran, dass die Einfügereihenfolge in einer Karte im Allgemeinen nicht eingehalten wird. Versuche dies :

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

Ich benutze dies nur, wenn ich mir sicher bin, dass das so ist map.size() == 1.


1

Whoamis Antwort verbessern. Da findFirst()ein zurückgegeben wird Optional, empfiehlt es sich zu überprüfen, ob ein Wert vorhanden ist.

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

Einige kommentierten auch, dass das Finden des ersten Schlüssels von a HashSetunzuverlässig ist. Aber manchmal haben wir HashMapPaare; dh in jeder Karte haben wir einen Schlüssel und einen Wert. In solchen Fällen ist es bequem, den ersten Schlüssel eines solchen Paares schnell zu finden.


0

Auch eine schöne Art dies zu tun :)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

-2

Sie können auch unten versuchen:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

1
Es gibt keine solche Methode
Adrian Grygutis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.