Imprimir HashMap en Java


129

Tengo un HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

Ahora me gustaría revisar todos los valores e imprimirlos.

Yo escribí esto:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

No parece funcionar.

¿Cuál es el problema?

EDITAR: Otra pregunta: ¿esta colección está basada en cero? Quiero decir, si tiene 1 clave y valor, ¿el tamaño será 0 o 1?


2
Le recomiendo que se familiarice con la documentación de Java (responderá muchas de sus preguntas). Por ejemplo, esta es la documentación de Map's size()método : ' Devuelve el número de asignaciones de valores clave en este mapa Si el mapa contiene más Integer.MAX_VALUEelementos, vuelve Integer.MAX_VALUE.'
Adam Paynter,

Su código está buscando valores en claves, lo cual no es correcto. Busque la clave en Claves o el valor en Valores
d-live

2
Si tiene 1 clave / valor, por supuesto, tendrá un tamaño 1. Pero esto no tiene nada que ver con la indexación basada en cero.
Jesper

Esta es una buena pregunta. Pero hay una respuesta aquí proporcionada que puede hacer esto en una línea, si ve la solución de Mingfei.
HoldOffHunger

Respuestas:


140

keySet () solo devuelve un conjunto de claves de su hashmap, debe iterar este conjunto de claves y obtener el valor del hashmap utilizando estas claves.

En su ejemplo, el tipo de clave del hashmap es TypeKey, pero especificó TypeValueen su bucle for genérico, por lo que no se puede compilar. Debes cambiarlo a:

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Actualización para Java8:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

Si no necesita imprimir el valor de la clave y solo necesita el valor del hashmap, puede usar las sugerencias de otros.

Otra pregunta: ¿esta colección es de base cero? Quiero decir, si tiene 1 clave y valor, ¿tendrá un tamaño de 0 o 1?

La colección devuelta de keySet()es un conjunto . No puede obtener el valor de un conjunto utilizando un índice, por lo que no se trata de si está basado en cero o en uno. Si su hashmap tiene una clave, el keySet () devuelto tendrá una entrada adentro, y su tamaño será 1.


19
O mejor aún:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter,

2
O incluso más compacto: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

Una forma sencilla de ver los pares de valores clave:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

Tanto el método 1 como el método 2 generan esto:

[{b=2, a=1}]

21
Simplemente haga lo siguiente:, System.out.println(map);salida:{b=2, a=1}
Mingfei

Sí ... una salida más similar:System.out.println(map.toString());
Yo Apps el

1
@yoapps tenga cuidado con NPE en este caso. Es por eso que evito .toStringcuando sea posible.
Maroun

Es verdad. el NPE siempre acecha en tales atajos. Solo quería mostrar una salida similar ... Creo que especialmente cuando estás depurando en un registro / consola y simplemente quieres mirar en un mapa cuyos datos sabes que no son nulos. Este es un fuego rápido! Pero si su código se verifica desde cero ... entonces tienes razón, es complicado y en un buen contexto de programación, ¡debe evitarse!
Yo Apps

40

Suponiendo que tiene un Map<KeyType, ValueType>, puede imprimirlo así:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

Para imprimir tanto la clave como el valor, use lo siguiente:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
Te falta otro paréntesis antes del punto y coma en la tercera línea.
nktsamba


9

Desea el conjunto de valores, no el conjunto de claves:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

El código que proporcione ni siquiera se compilará, lo que puede valer la pena mencionar en futuras preguntas: ¡"parece que no funciona" es un poco vago!


8

Vale la pena mencionar el enfoque Java 8, el uso BiConsumery las funciones lambda:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

Suponiendo que ha anulado el toStringmétodo de los dos tipos si es necesario.


7

Para mí, esta simple línea funcionó bien:

Arrays.toString(map.entrySet().toArray())

6

Una simple declaración de impresión con el nombre de la variable que contiene la referencia del Hash Map haría:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

Esto funciona porque el toString()método ya está anulado en el AbstractMap classque se extiende con la HashMap Class información adicional de la documentación

Devuelve una representación de cadena de este mapa. La representación de cadena consiste en una lista de asignaciones de clave-valor en el orden devuelto por el iterador de la vista entrySet del mapa, encerrado entre llaves ("{}"). Las asignaciones adyacentes están separadas por los caracteres "," (coma y espacio). Cada asignación de clave-valor se representa como la clave seguida de un signo igual ("=") seguido del valor asociado. Las claves y los valores se convierten en cadenas como por String.valueOf (Object).


2
Esta parece ser la mejor respuesta de las anteriores.
Karan Ahuja

5

Nuevo forEachestilo de características de Java 8

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

Lo hice usando el mapa de cadena (si está trabajando con el mapa de cadena).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Usar las funciones de java 8


3
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación, y probablemente resultaría en más votos positivos. Recuerde que está respondiendo la pregunta para los lectores en el futuro, no solo la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Dave

2

Útil para imprimir rápidamente entradas en un HashMap

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

Si el mapa contiene una colección como valor, las otras respuestas requieren un esfuerzo adicional para convertirlas como cadenas, como Arrays.deepToString(value.toArray())(si es un mapa de valores de lista), etc.

Enfrenté estos problemas con bastante frecuencia y encontré la función genérica para imprimir todos los objetos usando ObjectMappers. Esto es bastante útil en todos los lugares, especialmente durante la experimentación, y le recomendaría que elija de esta manera.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

Puedes usar la Entryclase para leer HashMapfácilmente.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.