Herhaal door een HashMap

Wat is de beste manier om de items in een HashMap?


Antwoord 1, autoriteit 100%

Herhaal door de entrySet() vind ik leuk:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

Lees meer over Map.


Antwoord 2, autoriteit 96%

Als je alleen geïnteresseerd bent in de sleutels, kun je herhalen via de keyset() van de kaart:

Map<String, Object> map = ...;
for (String key : map.keySet()) {
    // ...
}

Als u alleen de waarden nodig heeft, gebruikt u values():

for (Object value : map.values()) {
    // ...
}

Ten slotte, als u zowel de sleutel als de waarde wilt, gebruikt u entrySet():

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

Eén waarschuwing: als je items halverwege de iteratie wilt verwijderen, moet je dit doen via een Iterator (zie antwoord van karim79). Het wijzigen van itemwaarden is echter OK (zie Map.Entry).


Antwoord 3, autoriteit 25%

Geëxtraheerd uit de referentie Itereren over een kaart in Java :

Er zijn verschillende manieren om een ​​Map in Java te herhalen. Laten we de meest voorkomende methoden doornemen en hun voor- en nadelen bekijken. Aangezien alle kaarten in Java de kaartinterface implementeren, werken de volgende technieken voor elke kaartimplementatie (HashMap, TreeMap, LinkedHashMap, Hashtable, enz.)

Methode #1: itereren over items met behulp van een For-Each-lus.

Dit is de meest gebruikelijke methode en verdient in de meeste gevallen de voorkeur. Het moet worden gebruikt als u zowel kaartsleutels als waarden in de lus nodig heeft.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Houd er rekening mee dat de For-Each-lus is geïntroduceerd in Java 5, dus deze methode werkt alleen in nieuwere versies van de taal. Ook zal een For-Each-lus NullPointerException genereren als u een kaart probeert te herhalen die null is, dus voordat u itereert, moet u altijd controleren op null-referenties.

Methode #2: itereren over sleutels of waarden met behulp van een For-Each-lus.

Als u alleen sleutels of waarden van de kaart nodig heeft, kunt u keySet of waarden herhalen in plaats van entrySet.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// Iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}
// Iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

Deze methode geeft een klein prestatievoordeel ten opzichte van entrySet iteratie (ongeveer 10% sneller) en is schoner.

Methode #3: Itereren met Iterator.

Algemeen gebruiken:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Zonder Generiek:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}

Je kunt dezelfde techniek ook gebruiken om keySet of waarden te herhalen.

Deze methode lijkt misschien overbodig, maar heeft zijn eigen voordelen. Allereerst is het de enige manier om een ​​kaart in oudere versies van Java te herhalen. De andere belangrijke eigenschap is dat het de enige methode is waarmee je items van de kaart kunt verwijderen tijdens iteratie door iterator.remove() aan te roepen. Als je dit probeert te doen tijdens For-Each iteratie krijg je “onvoorspelbare resultaten” volgens Javadoc.

Vanuit prestatieoogpunt is deze methode gelijk aan een For-Each iteratie.

Methode #4: sleutels herhalen en zoeken naar waarden (inefficiënt).

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key = " + key + ", Value = " + value);
}

Dit lijkt misschien een schoner alternatief voor methode #1, maar in de praktijk is het vrij traag en inefficiënt omdat het ophalen van waarden door een sleutel tijdrovend kan zijn (deze methode in verschillende Map-implementaties is 20%-200% langzamer dan methode #1). Als je FindBugs hebt geïnstalleerd, zal het dit detecteren en je waarschuwen voor inefficiënte iteratie. Deze methode moet worden vermeden.

Conclusie:

Als je alleen sleutels of waarden van de kaart nodig hebt, gebruik dan methode #2. Als je vastzit aan een oudere versie van Java (minder dan 5) of van plan bent om items tijdens iteratie te verwijderen, moet je methode #3 gebruiken. Gebruik anders methode #1.


Antwoord 4, autoriteit 5%

for (Map.Entry<String, String> item : hashMap.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}

Antwoord 5, autoriteit 3%

U kunt de items in een Map op verschillende manieren. Verkrijg elke sleutel en waarde als volgt:

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

Of je kunt de lijst met sleutels krijgen met

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}

Als u alleen alle waarden wilt krijgen en u niet bezig bent met de sleutels, kunt u het volgende gebruiken:

Collection<?> values = map.values();

Antwoord 6, autoriteit 2%

Slimmer:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

Antwoord 7

Hangt ervan af. Als je weet dat je zowel de sleutel als de waarde van elk item nodig hebt, ga dan door de entrySet. Als je alleen de waarden nodig hebt, is er de methode values(). En als je alleen de sleutels nodig hebt, gebruik dan keyset().

Een slechte gewoonte zou zijn om alle sleutels te doorlopen en dan binnen de lus altijd map.get(key) te doen om de waarde te krijgen. Als je dat doet, dan is de eerste optie die ik schreef voor jou.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes