Stampa di HashMap in Java


129

Ho un HashMap:

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

Ora vorrei scorrere tutti i valori e stamparli.

Ho scritto questo:

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

Non sembra funzionare.

Qual è il problema?

EDIT: Un'altra domanda: questa raccolta è a base zero? Voglio dire, se ha 1 chiave e il valore sarà 0 o 1?


2
Ti consiglio di familiarizzare con la documentazione di Java (risponderà a molte delle tue domande). Ad esempio, questa è la documentazione Mapdel size()metodo di : "Restituisce il numero di mappature valore-chiave in questa mappa. Se la mappa contiene più di Integer.MAX_VALUEelementi, restituisce Integer.MAX_VALUE."
Adam Paynter

Il tuo codice sta cercando valori nelle chiavi, il che non è corretto. Cerca la chiave in Chiavi o il valore in Valori
d-live

2
Se ha 1 chiave / valore, ovviamente avrà dimensione 1. Ma questo non ha nulla a che fare con l'indicizzazione a base zero.
Jesper

Questa è una buona domanda. Ma c'è una risposta qui fornita qui che può farlo in una riga, se vedi la soluzione di Mingfei.
HoldOffHunger

Risposte:


140

keySet () restituisce solo un set di chiavi dalla tua hashmap, dovresti iterare questo set di chiavi e ottenere il valore dalla hashmap usando queste chiavi.

Nel tuo esempio, il tipo di chiave dell'hashmap è TypeKey, ma hai specificato TypeValuenel tuo ciclo for generico, quindi non può essere compilato. Dovresti cambiarlo in:

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

Aggiornamento per Java8:

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

Se non hai bisogno di stampare il valore della chiave e hai solo bisogno del valore hashmap, puoi usare i suggerimenti degli altri.

Un'altra domanda: questa collezione è a base zero? Voglio dire, se ha 1 chiave e il valore sarà 0 o 1?

La raccolta restituita da keySet()è un Set . Non è possibile ottenere il valore da un Set utilizzando un indice, quindi non è una questione se è a base zero o in base uno. Se la tua hashmap ha una chiave, il keySet () restituito avrà una voce all'interno e la sua dimensione sarà 1.


19
O meglio ancora:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
O ancora più compatto: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

Un modo semplice per vedere le coppie chiave-valore:

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

Sia il metodo 1 che il metodo 2 producono questo:

[{b=2, a=1}]

21
Fai come System.out.println(map);{b=2, a=1}
:,

Sì ... un altro risultato simile:System.out.println(map.toString());
Yo Apps

1
@yoapps fa attenzione a NPE in questo caso. Ecco perché evito il .toStringquando possibile.
Maroun

È vero. l'NPE si annida sempre in tali scorciatoie. Volevo solo mostrare un output simile .. Penso che specialmente quando esegui il debug su un log / console e vuoi semplicemente sbirciare in una mappa di cui sai che i dati non sono nulli. questo è un fuoco veloce! Ma se il suo codice controlla da zero ... allora hai ragione, è complicato e in un buon contesto di programmazione, dovrebbe essere evitato!
Yo Apps

40

Supponendo che tu abbia un Map<KeyType, ValueType>, puoi stamparlo in questo modo:

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

16

Per stampare sia la chiave che il valore, utilizzare quanto segue:

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

1
Manca un'altra parentesi prima del punto e virgola sulla 3a riga.
nktsamba


9

Vuoi il valore impostato, non il set di chiavi:

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

Il codice che fornisci non viene nemmeno compilato, il che potrebbe valere la pena menzionare nelle domande future: "non sembra funzionare" è un po 'vago!


8

Vale la pena menzionare l'approccio Java 8, l'utilizzo BiConsumere le funzioni lambda:

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

example.forEach(consumer);

Supponendo che tu abbia sovrascritto il toStringmetodo dei due tipi, se necessario.


7

Per me questa semplice riga ha funzionato bene:

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

6

Una semplice istruzione print con il nome della variabile che contiene il riferimento della mappa hash farebbe:

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

Questo funziona perché il toString()metodo è già superato nel AbstractMap classquale è esteso da HashMap Class Ulteriori informazioni dalla documentazione

Restituisce una rappresentazione di stringa di questa mappa. La rappresentazione di stringa consiste in un elenco di mappature valore-chiave nell'ordine restituito dall'iteratore della vista entrySet della mappa, racchiuso tra parentesi graffe ("{}"). Le mappature adiacenti sono separate dai caratteri "," (virgola e spazio). Ogni mappatura valore-chiave viene visualizzata come chiave seguita da un segno di uguale ("=") seguito dal valore associato. Chiavi e valori vengono convertiti in stringhe come da String.valueOf (Object).


2
questa sembra essere la migliore risposta tra quelle sopra.
Karan Ahuja

5

Nuovo forEachstile di funzionalità 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

L'ho fatto usando String map (se stai lavorando con String Map).

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

Utilizzo delle funzionalità di Java 8


3
Sebbene questo codice possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post e probabilmente si tradurrebbe in più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo alla persona che chiede ora. Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Dave

2

Utile per stampare rapidamente voci in una HashMap

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

1

Se la mappa contiene una raccolta come valore, le altre risposte richiedono uno sforzo aggiuntivo per convertirle in stringhe, ad esempio Arrays.deepToString(value.toArray()) (se è una mappa di valori di elenco), ecc.

Ho affrontato questi problemi abbastanza spesso e mi sono imbattuto nella funzione generica per stampare tutti gli oggetti utilizzando ObjectMappers. Questo è abbastanza utile in tutti i posti, specialmente durante la sperimentazione, e ti consiglio di scegliere in questo modo.

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

Puoi usare la Entryclasse per leggere HashMapfacilmente.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.