HashMap - ottenere il valore della prima chiave


129

Di seguito sono riportati i valori contenuti in HashMap

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

Codice Java per ottenere la prima chiave (cioè attiva)

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

Come possiamo raccogliere la prima chiave "Valore" (cioè 33), voglio memorizzare sia la "Chiave" che il "Valore" in una variabile separata.


9
Ti rendi conto che le HashMapvoci non sono ordinate e quindi "first" potrebbe cambiare ogni volta che modifichi la mappa?
NPE

1
Capisci che non esiste un ordine specifico in a HashMap? Se lo modifichi, potresti ottenere i risultati in un ordine completamente diverso.
Jon Skeet

No, l'ordine non è garantito da un'esecuzione all'altra, ma all'interno dello stesso thread è possibile fare affidamento sull'ordine.
hd1

1
@ JonSkeet In realtà questa è una domanda davvero valida. In Groovy ci sono molti casi in cui ottieni una struttura che assomiglia a un elenco di mappe, ciascuna mappa con una singola voce. Finora non ho trovato un modo facile / ovvio (Groovy) per stampare tutti i valori. Se le chiavi sono costanti, è facile come collection.each {println it.key} stampare ogni valore, ma senza chiavi costanti non è ovvio, ma collection.each {println it.values ​​() [0]} funziona ( Un raffinamento di alcune delle risposte qui ...).
Bill K

@ BillK: Se sai che ogni mappa ha esattamente una voce, allora questa è davvero una domanda diversa e una che ha più senso.
Jon Skeet

Risposte:


251

Puoi provare questo:

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

Tieni presente HashMapche non garantisce l'ordine di inserzione. Usa a LinkedHashMapper mantenere intatto l'ordine.

Per esempio:

 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);

Produzione:

 Active
 33

So che questa è una risposta molto vecchia .. funziona per hashmap con chiave e valore come stringhe. ma quando provo lo stesso con l'oggetto per un valore che ottiene un errore di casting: com.google.gson.internal.LinkedTreeMap cannot be cast to...... la mia classe che ho indicato al posto della Stringnel posto giusto ... non riesco a trovare una risposta online .. aiuto
Blue Bot

@darthydarth dovresti usare il tipo corretto in base al tuo contesto.
Ruchira Gayan Ranaweera,

primo super grazie per aver risposto! non me lo aspettavo ... secondo me, ho scoperto che c'è un problema con i Generics non salvati in runtime. alla fine l'ho aggirato usando Gsonper convertire l'oggetto valore in a Stringe poi analizzarlo di nuovo nel mio tipo di classe. È brutto ma davvero non sono riuscito a trovare nessun'altra soluzione a qualcosa che è così facile da fare in altre lingue (sto imparando Java ora)
Blue Bot

certo ma come? è troppo per la sezione commenti
Blue Bot

@darthydarth puoi mandarmi una mail. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Per ottenere il "primo" valore:

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

Per ottenere il valore della "prima" chiave:

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

Nota: codice sopra testato e funziona.

Dico "primo" perché le voci HashMap non sono ordinate.

Tuttavia, una LinkedHashMap itera le sue voci nello stesso ordine in cui sono state inserite: potresti usarlo per l'implementazione della mappa se l'ordine di inserimento è importante.


devi prima controllare che la mappa non sia vuota
ACV

48

Java 8 modo di fare,

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


se abbiamo la chiave, recupera il primo valore usando map.get (firstKey). Solo un suggerimento. :)
Upen

7

Puoi anche provare questo per ottenere l'intera prima voce,

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

Questo per ottenere solo la chiave della prima voce,

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

Questo per ottenere solo il valore della prima voce,

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

Inoltre, nel caso in cui tu sappia cosa stai facendo e desideri ottenere il secondo (lo stesso per il terzo ecc.) Di una mappa, dovresti provare questo,

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

come possiamo raccogliere la prima chiave "Valore" (es. 33)

Usando youMap.get(keyYouHave), puoi ottenere il valore di esso.

desidera memorizzare sia la "chiave" che il "valore" in una variabile separata

Sì, puoi assegnarlo a una variabile.

Aspetta ......... non è finita.

Se tu (logica aziendale) dipendi dall'ordine di inserimenti e di recupero, vedrai risultati strani. La mappa non è ordinata, non verrà memorizzata in un ordine. Si prega di essere consapevoli di questo fatto. Usa qualche alternativa per preservare il tuo ordine. Probabilmente aLinkedHashMap


2

Nota che dovresti notare che il tuo flusso logico non deve mai fare affidamento sull'accesso agli HashMapelementi in un certo ordine, semplicemente perché le HashMaps non sono ordinate Collectione non è ciò a cui mirano. (Puoi leggere di più sulle collezioni ordinate e smistate in questo post ).

Tornando al post, hai già fatto metà del lavoro caricando la chiave del primo elemento:

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

Basta chiamare map.get(key)per ottenere il rispettivo valore:

Object myValue = statusName.get(myKey);

1

Ricorda che l'ordine di inserzione non viene rispettato in una mappa in generale. Prova questo :

    /**
     * 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;
    }

Lo uso solo quando sono sicuro che quello map.size() == 1.


1

Migliorare la risposta di whoami. Poiché findFirst()restituisce un Optional, è buona norma verificare se è presente un valore.

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

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

 var key = optional.get();

Inoltre, alcuni hanno commentato che trovare la prima chiave di a HashSetnon è affidabile. Ma a volte abbiamo delle HashMapcoppie; cioè in ogni mappa abbiamo una chiave e un valore. In questi casi è conveniente trovare rapidamente la prima chiave di una tale coppia.


0

Anche un bel modo per farlo :)

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

-2

Puoi anche provare di seguito:

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

1
Non esiste un metodo del genere
Adrian Grygutis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.