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.

Prabu
quelle
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
Ruchira Gayan Ranaweera
quelle
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. [email protected]
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.

Böhmisch
quelle
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();

Wer bin ich
quelle
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();
George Siggouroglou
quelle
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

Suresh Atta
quelle
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);
Tmarwen
quelle
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.

Maxime Claude
quelle
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.

Jan Bodnar
quelle
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"));
Adrian
quelle
-2

Sie können auch unten versuchen:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);
Veera
quelle
1
Es gibt keine solche Methode
Adrian Grygutis