Drukowanie HashMap w Javie

129

Mam HashMap:

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

Teraz chciałbym przejrzeć wszystkie wartości i je wydrukować.

Ja to napisałem:

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

Wydaje się, że to nie działa.

Jaki jest problem?

EDYCJA: Kolejne pytanie: czy ta kolekcja jest zerowa? Mam na myśli, że jeśli ma 1 klucz i wartość, czy rozmiar będzie wynosił 0 czy 1?

Nieznany użytkownik
źródło
2
Polecam zapoznać się z dokumentacją Javy (będzie ona odpowiedzią na wiele pytań). Na przykład jest to dokumentacja metodyMap 's : „Zwraca liczbę odwzorowań klucz-wartość w tej mapie. Jeśli mapa zawiera więcej niż elementów, funkcja zwraca ”. size()Integer.MAX_VALUEInteger.MAX_VALUE
Adam Paynter
Twój kod szuka wartości w kluczach - co nie jest poprawne. Poszukaj klucza w Kluczach lub wartości w Wartości
d-live
2
Jeśli ma 1 klucz / wartość, to oczywiście będzie miał rozmiar 1. Ale to nie ma nic wspólnego z indeksowaniem od zera.
Jesper
To jest dobre pytanie. Ale jest tutaj podana odpowiedź, która może to zrobić w jednej linii, jeśli widzisz rozwiązanie Mingfei.
HoldOffHunger

Odpowiedzi:

140

keySet () zwraca tylko zestaw kluczy z twojego hashmap, powinieneś iterować ten zestaw kluczy i pobrać wartość z hashmap używając tych kluczy.

W twoim przykładzie typ klucza hashmap to TypeKey, ale określono go TypeValuew ogólnej pętli for, więc nie można go skompilować. Powinieneś to zmienić na:

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

Aktualizacja dla Java8:

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

Jeśli nie musisz drukować wartości klucza i potrzebujesz tylko wartości hashmap, możesz skorzystać z sugestii innych.

Kolejne pytanie: czy ta kolekcja jest zerowa? Mam na myśli, że jeśli ma 1 klucz i wartość, czy będzie to rozmiar 0 czy 1?

Kolekcja zwrócona z keySet()jest zestawem . Nie można pobrać wartości z zestawu przy użyciu indeksu, więc nie jest kwestią, czy jest ona oparta na zeru, czy na jedynce. Jeśli twój hashmap ma jeden klucz, zwrócony keySet () będzie miał jeden wpis w środku, a jego rozmiar będzie wynosił 1.

Ken Chan
źródło
19
Albo jeszcze lepiej:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter
2
Lub jeszcze bardziej kompaktowy: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO
93

Prosty sposób, aby zobaczyć pary klucz-wartość:

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

Zarówno metoda 1, jak i metoda 2 dają to:

[{b=2, a=1}]
Mingfei
źródło
21
Po prostu zrób tak System.out.println(map);{b=2, a=1}
:,
Tak ... jeszcze jedno podobne wyjście:System.out.println(map.toString());
Yo Apps
1
@yoapps uważaj na NPE w tym przypadku. Dlatego unikam tego, .toStringkiedy to możliwe.
Maroun
To prawda. NPE zawsze czai się w takich skrótach. Chciałem tylko pokazać podobne wyjście. Myślę, że szczególnie podczas debugowania do dziennika / konsoli i po prostu chcesz zerknąć na mapę, której dane, o których wiesz, nie są zerowe. to jest szybki ogień! Ale jeśli sprawdzanie kodu od zera ... to masz rację, jest to trudne i w dobrym kontekście programistycznym, należy tego unikać!
Yo Apps
40

Zakładając, że masz Map<KeyType, ValueType>, możesz wydrukować to w następujący sposób:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}
user000001
źródło
16

Aby wydrukować klucz i wartość, użyj następującego:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }
Venkatesh
źródło
1
Brakuje kolejnego nawiasu przed średnikiem w trzeciej linii.
nktsamba
9

Chcesz ustawić wartość, a nie zestaw kluczy:

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

Kod, który podałeś, nawet się nie skompilował, o czym warto wspomnieć w przyszłych pytaniach - „nie wydaje się działać” jest nieco niejasny!

davmac
źródło
8

Warto wspomnieć o podejściu Java 8, zastosowaniu BiConsumeri funkcjach lambda:

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

example.forEach(consumer);

Zakładając, że toStringw razie potrzeby zastąpiłeś metodę dwóch typów.

Maroun
źródło
7

Dla mnie ta prosta jedna linia działała dobrze:

Arrays.toString(map.entrySet().toArray())
KayV
źródło
6

Prosta instrukcja print z nazwą zmiennej, która zawiera odniesienie do mapy skrótów, zrobiłaby:

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

To działa, ponieważ toString()metoda jest już nadpisana w AbstractMap classrozszerzeniu o HashMap Class więcej informacji z dokumentacji

Zwraca ciąg znaków reprezentujący tę mapę. Reprezentacja w postaci ciągu składa się z listy odwzorowań klucz-wartość w kolejności zwróconej przez iterator widoku entrySet mapy, ujętej w nawiasy klamrowe („{}”). Sąsiednie odwzorowania są oddzielone znakami „,” (przecinek i spacja). Każde mapowanie klucz-wartość jest renderowane jako klucz, po którym następuje znak równości („=”), po którym następuje skojarzona z nim wartość. Klucze i wartości są konwertowane na ciągi jak przez String.valueOf (Object).

arjun gulyani
źródło
2
to wydaje się być najlepszą odpowiedzią spośród powyższych.
Karan Ahuja
5

Nowy forEachstyl funkcji 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
źródło
4

Zrobiłem to przy użyciu mapy ciągów (jeśli pracujesz z mapą ciągów).

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
źródło
3
map.forEach((key, value) -> System.out.println(key + " " + value));

Korzystanie z funkcji Java 8

Th0rgal
źródło
3
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Dave
2

Przydatne do szybkiego drukowania wpisów w HashMap

System.out.println(Arrays.toString(map.entrySet().toArray()));
Próg
źródło
1

Jeśli mapa zawiera kolekcję jako wartość, inne odpowiedzi wymagają dodatkowego wysiłku, aby przekonwertować je na ciągi, takie jak Arrays.deepToString(value.toArray())(jeśli jest to mapa wartości list) itp.

Dość często miałem do czynienia z tymi problemami i natrafiłem na ogólną funkcję drukowania wszystkich obiektów za pomocą ObjectMappers. Jest to bardzo przydatne we wszystkich miejscach, zwłaszcza podczas eksperymentowania, i radziłbym wybrać ten sposób.

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
źródło
0

Możesz użyć Entryklasy, aby HashMapłatwo czytać .

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Sagar Chilukuri
źródło