web-dev-qa-db-fra.com

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

Ci-dessous les valeurs contenues dans la carte de hachage

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

Code Java pour obtenir la première clé (i.e Active)

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

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

95
Prabu

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 que HashMap ne garantit pas l'ordre d'insertion. Utilisez un LinkedHashMap pour garder 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);

Sortie:

 Active
 33
188

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" parce que les entrées HashMap ne sont pas ordonnées.

Cependant, un LinkedHashMap itère ses entrées dans le même ordre d'insertion. Vous pouvez l'utiliser pour l'implémentation de votre carte si l'ordre d'insertion est important.

48
Bohemian

Java 8 façon de faire,

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

33
whoami

Vous pouvez également essayer ceci pour obtenir la première entrée complète,

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, si vous savez ce que vous faites et souhaitez obtenir le deuxième élément de la carte (identique pour le troisième, etc.), 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();
6
George Siggouroglou

comment pouvons-nous collecter la première clé "Valeur" (c'est-à-dire 33)

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

vouloir stocker les deux "Key" et "Value" dans une variable séparée

Oui, vous pouvez l'affecter à une variable.

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

Si vous (logique métier) dépendez de l'ordre d'insertion et d'extraction, vous obtiendrez des résultats étranges. La carte n'est pas commandée, elle ne sera pas stockée dans une commande. S'il vous plaît être conscient de ce fait. Utilisez une alternative pour préserver votre commande. Probablement un LinkedHashMap

4
Suresh Atta

Rappelez-vous 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 l’utilise seulement quand je suis sûr que ça map.size() == 1.

1
Maxime Claude

Notez que vous devez noter que votre flux logique ne doit jamais dépendre d'un accès aux éléments HashMap dans un ordre quelconque, simplement parce que HashMaps ne sont pas commandés Collections et que leur but n'est pas faire. (Vous pouvez en savoir plus sur les collections odered et sorter dans this post ).

De retour au poste, vous avez déjà effectué la moitié du travail en chargeant le premier élément clé:

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

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

Object myValue = statusName.get(myKey);
0
tmarwen

Améliorer la réponse de whoami. Puisque findFirst() renvoie un 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 fait remarquer que la recherche de la première clé d'une HashSet n'était pas fiable. Mais parfois nous avons HashMap paires; 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
Jan Bodnar