HashMap - Obtenir la valeur de la première clé


129

Voici les valeurs contenues dans le HashMap

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

Code Java pour obtenir la première clé (c.-à-d. Active)

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

Comment pouvons-nous collecter la première clé "Valeur" (c'est-à-dire 33), je veux stocker à la fois la "clé" et la "valeur" dans une variable distincte.


9
Vous vous rendez compte que les HashMapentrées ne sont pas ordonnées et que le "premier" peut donc changer chaque fois que vous modifiez la carte?
NPE

1
Comprenez-vous qu'il n'y a pas d'ordre spécifique dans un HashMap? Si vous le modifiez du tout, vous pouvez obtenir les résultats dans un ordre complètement différent.
Jon Skeet

Non, l'ordre n'est pas garanti d'une exécution à l'autre, mais dans le même thread, l'ordre peut être fiable.
hd1

1
@JonSkeet En fait, c'est une question vraiment valable. Dans Groovy, il y a beaucoup de cas où vous récupérez une structure qui ressemble à une liste de cartes, chaque carte avec une seule entrée. Jusqu'à présent, je n'ai pas trouvé de moyen facile / évident (Groovy) d'imprimer toutes les valeurs. Si les clés sont constantes, c'est aussi simple que collection.each {println it.key} d'imprimer chaque valeur, mais sans clés constantes ce n'est pas évident, mais collection.each {println it.values ​​() [0]} fonctionne ( Un raffinement de certaines des réponses ici ...).
Bill K

@BillK: Si vous savez que chaque carte a exactement une entrée, alors c'est une question vraiment différente, et qui a plus de sens.
Jon Skeet

Réponses:


251

Vous pouvez essayer ceci:

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

Gardez à l'esprit, HashMapne garantit pas l'ordre d'insertion. Utilisez a LinkedHashMappour conserver la commande intacte.

Par exemple:

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

Production:

 Active
 33

Je sais que c'est une très vieille réponse ... cela fonctionne pour les hashmaps avec la clé et la valeur sous forme de chaînes. mais en essayant la même chose avec un objet pour une valeur, une erreur de casting: com.google.gson.internal.LinkedTreeMap cannot be cast to...... ma classe que j'ai indiquée au lieu de la Stringau bon endroit ... ne peut pas trouver de réponse en ligne..aide
Blue Bot

@darthydarth, vous devez utiliser le type approprié en fonction de votre contexte.
Ruchira Gayan Ranaweera

premier super merci d'avoir répondu! je ne m'y attendais pas ... deuxièmement, j'ai trouvé qu'il y avait un problème avec les génériques non enregistrés au moment de l'exécution. Finalement, je l'ai piraté en utilisant Gsonpour convertir un objet de valeur en un Stringet ensuite l'analyser en mon type de classe. C'est moche mais je n'ai vraiment pas pu trouver d'autre solution à quelque chose de si facile à faire dans d'autres langues (j'apprends Java maintenant)
Blue Bot

sûr mais comment? c'est trop pour la section des commentaires
Blue Bot

@darthydarth vous pouvez m'envoyer un email. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Pour obtenir la "première" valeur:

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

Pour obtenir la valeur de la "première" clé:

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

Remarque: le code ci-dessus a été testé et fonctionne.

Je dis "premier" car les entrées HashMap ne sont pas ordonnées.

Cependant, un LinkedHashMap itère ses entrées dans le même ordre où elles ont été insérées - vous pouvez l'utiliser pour votre implémentation de carte si l'ordre d'insertion est important.


il faut d'abord vérifier que la carte n'est pas vide
ACV

48

Java 8 façon de faire,

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


si nous avons la clé, récupérez la première valeur en utilisant map.get (firstKey). Juste un indice. :)
Upen

7

Vous pouvez également essayer ceci pour obtenir l'intégralité de la première entrée,

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

Ceci pour obtenir uniquement la clé de la première entrée,

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

Ceci pour obtenir uniquement la valeur de la première entrée,

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

De plus, au cas où vous savez ce que vous faites et que vous souhaitez obtenir le deuxième (même pour le troisième, etc.) élément d'une carte, vous devriez essayer ceci,

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

comment pouvons-nous collecter la première clé "Valeur" (ie 33)

En utilisant youMap.get(keyYouHave), vous pouvez en obtenir la valeur.

voulez stocker la «clé» et la «valeur» dans une variable distincte

Oui, vous pouvez l'affecter à une variable.

Attendez ......... ce n'est pas fini.

Si vous (logique métier) dépendez de l'ordre des insertions et de la récupération, vous allez voir des résultats étranges. La carte n'est pas ordonnée, elle ne sera pas stockée dans une commande. Soyez conscient de ce fait. Utilisez une alternative pour conserver votre commande. Probablement unLinkedHashMap


2

Notez que vous devez noter que votre flux logique ne doit jamais reposer sur l'accès aux HashMapéléments dans un certain ordre, simplement parce que les HashMaps ne sont pas ordonnés Collectionet que ce n'est pas ce à quoi ils sont destinés. (Vous pouvez en savoir plus sur les collections odered et trieuses dans cet article ).

De retour à l'article, vous avez déjà fait la moitié du travail en chargeant la première clé d'élément:

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

Appelez simplement map.get(key)pour obtenir la valeur respective:

Object myValue = statusName.get(myKey);

1

N'oubliez pas que l'ordre d'insertion n'est pas respecté dans une carte en général. Essaye ça :

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

Je n'utilise ceci que lorsque j'en suis sûr map.size() == 1.


1

Améliorer la réponse de whoami. Puisque findFirst()renvoie an Optional, il est recommandé de vérifier s'il existe une valeur.

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

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

 var key = optional.get();

En outre, certains ont commenté que trouver la première clé de a HashSetn'est pas fiable. Mais parfois, nous avons des HashMappaires; c'est-à-dire que dans chaque carte, nous avons une clé et une valeur. Dans de tels cas, trouver rapidement la première clé d'une telle paire est pratique.


0

C'est aussi une belle façon de faire ça :)

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

-2

Vous pouvez également essayer ci-dessous:

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

1
Il n'y a pas une telle méthode
Adrian Grygutis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.