HashMap afdrukken in Java

Ik heb een HashMap:

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

Nu wil ik alle waarden doornemen en afdrukken.

Ik schreef dit:

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

Het lijkt niet te werken.

Wat is het probleem?

BEWERKEN:
Nog een vraag: is deze collectie op nul gebaseerd? Ik bedoel, als het 1 sleutel en waarde heeft, zal de grootte 0 of 1 zijn?


Antwoord 1, autoriteit 100%

keySet()retourneert alleen een set sleutels van uw hash-kaart, u moet deze sleutelset herhalen en de waarde van de hash-kaart verkrijgen met behulp van deze sleutels.

In uw voorbeeld is het type sleutel van de hashmap TypeKey, maar u heeft TypeValueopgegeven in uw generieke for-loop, dus het kan niet worden gecompileerd. Je moet het veranderen in:

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

Update voor Java8:

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

Als u geen sleutelwaarde hoeft af te drukken en alleen de hash-kaartwaarde nodig heeft, kunt u de suggesties van anderen gebruiken.

Nog een vraag: is deze verzameling een nulbasis? Ik bedoel, als het 1 sleutel en waarde heeft, zal het dan 0 of 1 zijn?

De verzameling die wordt geretourneerd door keySet()is een Set. U kunt de waarde niet uit een set halen met behulp van een index, dus het is niet de vraag of deze op nul of op één is gebaseerd. Als uw hash-kaart één sleutel heeft, bevat de geretourneerde keySet()één invoer en is de grootte 1.


Antwoord 2, autoriteit 57%

Een eenvoudige manier om de sleutelwaardeparen te zien:

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

Zowel methode 1 als methode 2 geven dit:

[{b=2, a=1}]

Antwoord 3, autoriteit 25%

Ervan uitgaande dat u een Map<KeyType, ValueType>heeft, kunt u deze als volgt afdrukken:

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

Antwoord 4, autoriteit 10%

Gebruik het volgende om zowel de sleutel als de waarde af te drukken:

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

Antwoord 5, autoriteit 7%

Je hebt verschillende opties


Antwoord 6, autoriteit 5%

U wilt dat de ingestelde waarde, niet de sleutel set:

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

De code die u geven zou niet eens samen te stellen, die het vermelden waard in de toekomst vragen kunnen zijn -! “Lijkt niet te werken” is een beetje vaag


Antwoord 7, Autoriteit 5%

Het vermelden waard Java 8 benadering, met behulp van BiConsumeren lambda functies:

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

In de veronderstelling dat je hebt overschreven toStringmethode van de twee typen als dat nodig is.


Antwoord 8, Autoriteit 4%

Een eenvoudige print-statement met de naam variabele die de referentie van de Hash Map bevat zou doen:

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

Dit werkt omdat de toString()methode al is overschreven in de AbstractMap classdie wordt uitgebreid met de HashMap Class
Meer informatie uit de documentatie

Retourneert een tekenreeksrepresentatie van deze kaart. De tekenreeksrepresentatie bestaat uit een lijst met sleutel-waarde-toewijzingen in de volgorde die wordt geretourneerd door de iterator van de entrySet-weergave van de kaart, tussen accolades (“{}”). Aangrenzende toewijzingen worden gescheiden door de tekens “, ” (komma en spatie). Elke sleutel/waarde-toewijzing wordt weergegeven als de sleutel gevolgd door een gelijkteken (“=”) gevolgd door de bijbehorende waarde. Sleutels en waarden worden geconverteerd naar strings zoals door String.valueOf(Object).


Antwoord 9, autoriteit 4%

Voor mij werkte deze simpele regel goed:

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

Antwoord 10, autoriteit 4%

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

Java 8-functies gebruiken


Antwoord 11, autoriteit 3%

Java 8 nieuwe functie forEachstijl

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
    }
}

Antwoord 12, autoriteit 3%

Nuttig om snel items in een HashMap af te drukken

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

Antwoord 13, autoriteit 2%

Ik deed het met String map (als je met String Map werkt).

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

Antwoord 14

Als de kaart een verzameling als waarde bevat, vergen de andere antwoorden extra inspanning om ze als tekenreeksen te converteren, zoals Arrays.deepToString(value.toArray())(als het een kaart van een lijst is waarden), enz.

Ik kwam deze problemen vaak tegen en kwam de generieke functie tegen om alle objecten af te drukken met behulp van ObjectMappers. Dit is overal heel handig, vooral tijdens het experimenteren met dingen, en ik zou je aanraden om voor deze manier te kiezen.

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

Antwoord 15

Je kunt de klasse Entrygebruiken om HashMapgemakkelijk te lezen.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}

Other episodes