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?

Usuario desconocido
fuente
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.

Ken Chan
fuente
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}]
Mingfei
fuente
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());
}
user000001
fuente
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));
 }
Venkatesh
fuente
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!

davmac
fuente
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.

Maroun
fuente
7

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

Arrays.toString(map.entrySet().toArray())
KayV
fuente
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).

arjun gulyani
fuente
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

    }
}
ahmet
fuente
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());
}
Edson Júnior
fuente
3
map.forEach((key, value) -> System.out.println(key + " " + value));

Usar las funciones de java 8

Th0rgal
fuente
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()));
Límite
fuente
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;
}
Thirukka Karnan
fuente
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
}
Sagar Chilukuri
fuente