HashMap: obtener el valor de la primera clave

129

A continuación se muestran los valores que contiene el HashMap

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

Código Java para obtener la primera clave (es decir, activa)

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

¿Cómo podemos recopilar el primer "Valor" clave (es decir, 33)? Quiero almacenar tanto la "Clave" como el "Valor" en una variable separada.

Prabu
fuente
9
¿Se da cuenta de que las HashMapentradas están desordenadas y, por lo tanto, "primero" podría cambiar cada vez que modifique el mapa?
NPE
1
¿Entiende que no hay un orden específico en un HashMap? Si lo modifica, puede obtener los resultados en un orden completamente diferente.
Jon Skeet
No, el orden no está garantizado de ejecución a ejecución, pero dentro del mismo hilo, se puede confiar en el orden.
hd1
1
@JonSkeet En realidad, esta es una pregunta realmente válida. En Groovy hay muchos casos en los que se obtiene una estructura que parece una lista de mapas, cada mapa con una sola entrada. Hasta ahora no he encontrado una forma fácil / obvia (Groovy) de imprimir todos los valores. Si las claves son constantes, es tan fácil como collection.each {println it.key} imprimir cada valor, pero sin claves constantes no es obvio, pero collection.each {println it.values ​​() [0]} funciona ( Un refinamiento de algunas de las respuestas aquí ...).
Bill K
@BillK: Si sabe que cada mapa tiene exactamente una entrada, entonces esa es realmente una pregunta diferente, y una que tiene más sentido.
Jon Skeet

Respuestas:

251

Puedes probar esto:

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

Tenga en cuenta HashMapque no garantiza el pedido de inserción. Utilice a LinkedHashMappara mantener el orden intacto.

P.ej:

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

Salida:

 Active
 33
Ruchira Gayan Ranaweera
fuente
Sé que esta es una respuesta muy antigua ... esto funciona para hashmaps con clave y valor como cadenas. pero al intentar lo mismo con el objeto por un valor, se obtiene un error de lanzamiento: com.google.gson.internal.LinkedTreeMap cannot be cast to...... mi clase que dije en lugar de la Stringen el lugar correcto ... no puedo encontrar la respuesta en línea
Blue Bot
@darthydarth, debe usar el tipo adecuado según su contexto.
Ruchira Gayan Ranaweera
primero super gracias por responder! No me lo esperaba ... segundo, descubrí que hay un problema con los genéricos que no se guardan en tiempo de ejecución. eventualmente lo pirateé usando Gsonpara convertir el objeto de valor en Stringay luego analizarlo de nuevo a mi tipo de clase. Es feo, pero realmente no pude encontrar ninguna otra solución para algo que es tan fácil de hacer en otros idiomas (ahora estoy aprendiendo Java)
Blue Bot
seguro pero como es demasiado para la sección de comentarios
Blue Bot
@darthydarth puedes enviarme un correo electrónico. [email protected]
Ruchira Gayan Ranaweera
65

Para obtener el "primer" valor:

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

Para obtener el valor de la "primera" clave:

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

Nota: el código anterior probado y funciona.

Digo "primero" porque las entradas de HashMap no están ordenadas.

Sin embargo, un LinkedHashMap itera sus entradas en el mismo orden en que se insertaron; puede usar eso para la implementación de su mapa si el orden de inserción es importante.

Bohemio
fuente
primero debe verificar que el mapa no esté vacío
ACV
48

Forma de hacer Java 8,

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

quién soy
fuente
si tenemos la clave, recuperamos el primer valor usando map.get (firstKey). Solo una pista. :)
Abierto el
7

También puede probar esto para obtener la primera entrada completa,

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

Esto para obtener solo la clave de la primera entrada,

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

Esto para obtener solo el valor de la primera entrada,

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

Además, en caso de que sepa lo que está haciendo y desee obtener el segundo elemento (lo mismo para el tercero, etc.) de un mapa, debe probar esto,

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
fuente
4

¿Cómo podemos recopilar el primer "Valor" clave (es decir, 33)

Al usarlo youMap.get(keyYouHave), puede obtener el valor de la misma.

desea almacenar la "Clave" y el "Valor" en una variable separada

Sí, puede asignar eso a una variable.

Espera ......... no ha terminado.

Si usted (lógica empresarial) depende del orden de inserciones y recuperaciones, verá resultados extraños. El mapa no está ordenado, no se almacenarán en un pedido. Tenga en cuenta ese hecho. Utilice alguna alternativa para conservar su pedido. Probablemente unLinkedHashMap

Suresh Atta
fuente
2

Tenga en cuenta que debe tener en cuenta que su flujo lógico nunca debe depender del acceso a los HashMapelementos en algún orden, simplemente porque los HashMaps no están ordenados Collectiony eso no es lo que pretenden hacer. (Puede leer más sobre colecciones ordenadas y clasificadoras en esta publicación ).

Volviendo a la publicación, ya hiciste la mitad del trabajo cargando la clave del primer elemento:

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

Simplemente llame map.get(key)para obtener el valor respectivo:

Object myValue = statusName.get(myKey);
tmarwen
fuente
1

Recuerde que el orden de inserción no se respeta en un mapa en general. Prueba esto :

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

Solo uso esto cuando estoy seguro de eso map.size() == 1.

Maxime Claude
fuente
1

Mejorando la respuesta de Whoami. Dado que findFirst()devuelve un Optional, es una buena práctica comprobar si hay un valor.

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

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

 var key = optional.get();

Además, algunos comentaron que encontrar la primera clave de a HashSetno es confiable. Pero a veces tenemos HashMapparejas; es decir, en cada mapa tenemos una clave y un valor. En tales casos, es conveniente encontrar rápidamente la primera clave de dicho par.

Jan Bodnar
fuente
0

También es una buena forma de hacer esto :)

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

También puede probar a continuación:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);
Veera
fuente
1
No existe tal método
Adrian Grygutis