Als ik een object heb dat de Map
-interface in Java implementeert en ik wil elk paar daarin herhalen, wat is dan de meest efficiënte manier om door de kaart te gaan?
Zal de volgorde van elementen afhangen van de specifieke kaartimplementatie die ik heb voor de interface?
Antwoord 1, autoriteit 100%
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
Op Java 10+:
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
Antwoord 2, autoriteit 26%
Om de andere antwoorden samen te vatten en te combineren met wat ik weet, heb ik 10 manieren gevonden om dit te doen (zie hieronder). Ook heb ik enkele prestatietests geschreven (zie onderstaande resultaten). Als we bijvoorbeeld de som van alle sleutels en waarden van een kaart willen vinden, kunnen we schrijven:
-
iteratoren Map.Entry
gebruiken
long i = 0; Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, Integer> pair = it.next(); i += pair.getKey() + pair.getValue(); }
-
Gebruik foreachen Map.Entry
long i = 0; for (Map.Entry<Integer, Integer> pair : map.entrySet()) { i += pair.getKey() + pair.getValue(); }
-
Gebruik forEachvan Java 8
final long[] i = {0}; map.forEach((k, v) -> i[0] += k + v);
-
keySeten foreach
gebruiken
long i = 0; for (Integer key : map.keySet()) { i += key + map.get(key); }
-
Gebruik keySeten iterator
long i = 0; Iterator<Integer> itr2 = map.keySet().iterator(); while (itr2.hasNext()) { Integer key = itr2.next(); i += key + map.get(key); }
-
Gebruik foren Map.Entry
long i = 0; for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) { Map.Entry<Integer, Integer> entry = entries.next(); i += entry.getKey() + entry.getValue(); }
-
De Java 8 Stream API
gebruiken
final long[] i = {0}; map.entrySet().stream().forEach(e -> i[0] += e.getKey() + e.getValue());
-
De Java 8 Stream API parallel gebruiken
final long[] i = {0}; map.entrySet().stream().parallel().forEach(e -> i[0] += e.getKey() + e.getValue());
-
IterableMapvan
Apache Collections
gebruiken
long i = 0; MapIterator<Integer, Integer> it = iterableMap.mapIterator(); while (it.hasNext()) { i += it.next() + it.getValue(); }
-
MutableMap van Eclipse (CS) -collecties
final long[] i = {0}; mutableMap.forEachKeyValue((key, value) -> { i[0] += key + value; });
Perfomance-tests (MODE = Averagetime, System = Windows & NBSP; 8.1 64-bit, Intel I7-4790 3,60 GHz, 16 & NBSP; GB)
-
voor een kleine kaart (100 elementen), score 0.308 is de beste
Benchmark Mode Cnt Score Error Units test3_UsingForEachAndJava8 avgt 10 0.308 ± 0.021 µs/op test10_UsingEclipseMap avgt 10 0.309 ± 0.009 µs/op test1_UsingWhileAndMapEntry avgt 10 0.380 ± 0.014 µs/op test6_UsingForAndIterator avgt 10 0.387 ± 0.016 µs/op test2_UsingForEachAndMapEntry avgt 10 0.391 ± 0.023 µs/op test7_UsingJava8StreamApi avgt 10 0.510 ± 0.014 µs/op test9_UsingApacheIterableMap avgt 10 0.524 ± 0.008 µs/op test4_UsingKeySetAndForEach avgt 10 0.816 ± 0.026 µs/op test5_UsingKeySetAndIterator avgt 10 0.863 ± 0.025 µs/op test8_UsingJava8StreamApiParallel avgt 10 5.552 ± 0.185 µs/op
-
Voor een kaart met 10000 elementen, score 37.606 is de beste
Benchmark Mode Cnt Score Error Units test10_UsingEclipseMap avgt 10 37.606 ± 0.790 µs/op test3_UsingForEachAndJava8 avgt 10 50.368 ± 0.887 µs/op test6_UsingForAndIterator avgt 10 50.332 ± 0.507 µs/op test2_UsingForEachAndMapEntry avgt 10 51.406 ± 1.032 µs/op test1_UsingWhileAndMapEntry avgt 10 52.538 ± 2.431 µs/op test7_UsingJava8StreamApi avgt 10 54.464 ± 0.712 µs/op test4_UsingKeySetAndForEach avgt 10 79.016 ± 25.345 µs/op test5_UsingKeySetAndIterator avgt 10 91.105 ± 10.220 µs/op test8_UsingJava8StreamApiParallel avgt 10 112.511 ± 0.365 µs/op test9_UsingApacheIterableMap avgt 10 125.714 ± 1.935 µs/op
-
Voor een kaart met 100000 elementen is de score 1184.767 de beste
Benchmark Mode Cnt Score Error Units test1_UsingWhileAndMapEntry avgt 10 1184.767 ± 332.968 µs/op test10_UsingEclipseMap avgt 10 1191.735 ± 304.273 µs/op test2_UsingForEachAndMapEntry avgt 10 1205.815 ± 366.043 µs/op test6_UsingForAndIterator avgt 10 1206.873 ± 367.272 µs/op test8_UsingJava8StreamApiParallel avgt 10 1485.895 ± 233.143 µs/op test5_UsingKeySetAndIterator avgt 10 1540.281 ± 357.497 µs/op test4_UsingKeySetAndForEach avgt 10 1593.342 ± 294.417 µs/op test3_UsingForEachAndJava8 avgt 10 1666.296 ± 126.443 µs/op test7_UsingJava8StreamApi avgt 10 1706.676 ± 436.867 µs/op test9_UsingApacheIterableMap avgt 10 3289.866 ± 1445.564 µs/op
Grafieken (prestatietests afhankelijk van kaartgrootte)
Tabel (prestatietests afhankelijk van kaartgrootte)
100 600 1100 1600 2100
test10 0.333 1.631 2.752 5.937 8.024
test3 0.309 1.971 4.147 8.147 10.473
test6 0.372 2.190 4.470 8.322 10.531
test1 0.405 2.237 4.616 8.645 10.707
test2 0.376 2.267 4.809 8.403 10.910
test7 0.473 2.448 5.668 9.790 12.125
test9 0.565 2.830 5.952 13.220 16.965
test4 0.808 5.012 8.813 13.939 17.407
test5 0.810 5.104 8.533 14.064 17.422
test8 5.173 12.499 17.351 24.671 30.403
Alle tests staan op GitHub.
Antwoord 3, autoriteit 6%
In Java 8 kun je het schoon en snel doen met de nieuwe lambdas-functies:
Map<String,String> map = new HashMap<>();
map.put("SomeKey", "SomeValue");
map.forEach( (k,v) -> [do something with key and value] );
// such as
map.forEach( (k,v) -> System.out.println("Key: " + k + ": Value: " + v));
Het type k
en v
wordt afgeleid door de compiler en het is niet meer nodig om Map.Entry
te gebruiken.
p>
Gemakkelijk!
Antwoord 4, autoriteit 5%
Ja, de volgorde is afhankelijk van de specifieke implementatie van de kaart.
@ScArcher2 heeft de meer elegante Java 1.5-syntaxis. In 1.4 zou ik zoiets als dit doen:
Iterator entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Entry thisEntry = (Entry) entries.next();
Object key = thisEntry.getKey();
Object value = thisEntry.getValue();
// ...
}
Antwoord 5, autoriteit 3%
Typische code voor het herhalen van een kaart is:
Map<String,Thing> map = ...;
for (Map.Entry<String,Thing> entry : map.entrySet()) {
String key = entry.getKey();
Thing thing = entry.getValue();
...
}
HashMap
is de canonieke kaartimplementatie en biedt geen garanties (of hoewel het de volgorde niet zou moeten veranderen als er geen muterende bewerkingen op worden uitgevoerd). SortedMap
retourneert items op basis van de natuurlijke volgorde van de sleutels, of een Comparator
, indien aanwezig. LinkedHashMap
retourneert items in invoegvolgorde of toegangsvolgorde, afhankelijk van hoe het is opgebouwd. EnumMap
retourneert items in de natuurlijke volgorde van sleutels.
(Update: ik denk dat dit niet langer waar is.) Let op, IdentityHashMap
entrySet
iterator heeft momenteel een eigenaardige implementatie die hetzelfde teruggeeft Map.Entry
instantie voor elk item in de entrySet
! Echter, elke keer dat een nieuwe iterator vordert, wordt de Map.Entry
bijgewerkt.
Antwoord 6, autoriteit 2%
Voorbeeld van het gebruik van iterator en generieke geneesmiddelen:
Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Antwoord 7, autoriteit 2%
Dit is een tweedelige vraag:
De invoer van een kaart herhalen– @ScArcher2 heeft die perfect beantwoord.
Wat is de volgorde van iteratie– als je alleen Map
gebruikt, dan zijn er strikt genomen geen bestelgaranties. U moet dus niet echt vertrouwen op de volgorde die door een implementatie wordt gegeven. De SortedMap
interface breidt Map
uit en biedt precies wat u zoekt – implementaties zullen altijd een consistente sorteervolgorde geven.
NavigableMap
is een andere nuttige extensie– dit is een SortedMap
met aanvullende methoden voor het vinden van items op hun geordende positie in de sleutelset. Dus mogelijk kan dit de noodzaak voor iteratie in de eerste plaats wegnemen – u kunt mogelijk de specifieke entry
vinden die u zoekt na het gebruik van de higherEntry
, lowerEntry
, ceilingEntry
of floorEntry
methoden. De descendingMap
methode geeft je zelfs een expliciete methode om de verplaatsingsvolgorde om te keren.
8
FYI, u kunt ook map.keySet()
en map.values()
gebruiken als u alleen geïnteresseerd bent in sleutels / waarden van de kaart en niet de andere.
9
De juiste manier om dit te doen is om het geaccepteerde antwoord te gebruiken, omdat het het meest efficiënt is. Ik vind de volgende code een beetje schoner.
for (String key: map.keySet()) {
System.out.println(key + "/" + map.get(key));
}
Antwoord 10
Met Java 8kun je de kaart herhalen met forEach en lambda-expressies,
map.forEach((k, v) -> System.out.println((k + ":" + v)));
Antwoord 11
Bij Eclipse Collectionszou u de forEachKeyValue
-methode gebruiken op de MapIterable
interface, die wordt overgenomen door de MutableMap
en ImmutableMap
interfaces en hun implementaties.
MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue((key, value) -> result.add(key + value));
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
Met behulp van een anonieme innerlijke klasse kun je de code als volgt schrijven:
final MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue(new Procedure2<Integer, String>()
{
public void value(Integer key, String value)
{
result.add(key + value);
}
});
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
Opmerking:ik ben toegewijd aan Eclipse Collections.
Antwoord 12
In theorie is de meest efficiënte manier afhankelijk van welke implementatie van de kaart. De officiële manier om dit te doen, is om map.entrySet()
te bellen, die een set van Map.Entry
retourneert, die elk een sleutel en een waarde bevat (entry.getKey()
en entry.getValue()
).
In een idiosyncratische implementatie kan het een verschil maken of u map.keySet()
, map.entrySet()
of iets anders gebruikt. Maar ik kan geen reden bedenken waarom iemand het zo zou schrijven. Hoogstwaarschijnlijk maakt het geen verschil om te presteren wat u doet.
en ja, de bestelling is afhankelijk van de implementatie – evenals (mogelijk) de volgorde van insertie en andere hard-controlefactoren.
[bewerken] Ik schreef valueSet()
oorspronkelijk, maar natuurlijk entrySet()
is eigenlijk het antwoord.
Antwoord 13
LambdaExpressie Java 8
In Java 1.8 (Java 8) is dit een stuk eenvoudiger geworden door gebruik te maken van de forEachmethode van Aggregate operations(Stream operations) die lijkt op iterators van Iterable -interface.
Kopieer de onderstaande instructie gewoon in uw code en hernoem de variabele HashMapvan hmin uw HashMap-variabele om het sleutel/waarde-paar af te drukken.
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
* Logic to put the Key,Value pair in your HashMap hm
*/
// Print the key value pair in one line.
hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
// Just copy and paste above line to your code.
Hieronder staat de voorbeeldcode die ik heb geprobeerd met Lambda Expression. Dit spul is zo cool. Moet het proberen.
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
Random rand = new Random(47);
int i = 0;
while(i < 5) {
i++;
int key = rand.nextInt(20);
int value = rand.nextInt(50);
System.out.println("Inserting key: " + key + " Value: " + value);
Integer imap = hm.put(key, value);
if( imap == null) {
System.out.println("Inserted");
} else {
System.out.println("Replaced with " + imap);
}
}
hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
Output:
Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11
Je kunt ook Spliteratorhiervoor gebruiken.
Spliterator sit = hm.entrySet().spliterator();
UPDATE
Inclusief documentatielinks naar Oracle Docs.
Ga voor meer informatie over Lambdanaar deze linken moet Aggregate Operationslezen en ga voor Spliterator naar deze link.
Antwoord 14
Java 8:
U kunt lambda-expressies gebruiken:
myMap.entrySet().stream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
});
Volg voor meer informatie dit.
Antwoord 15
In Map kan men itereren over keys
en/of values
en/of both (e.g., entrySet)
afhankelijk van iemands interesse in_ Like :
-
Herhaal door de
keys -> keySet()
van de kaart:Map<String, Object> map = ...; for (String key : map.keySet()) { //your Business logic... }
-
Herhaal door de
values -> values()
van de kaart:for (Object value : map.values()) { //your Business logic... }
-
Herhaal door de
both -> entrySet()
van de kaart:for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); //your Business logic... }
Bovendien zijn er 3 verschillende manieren om te itereren via een hashmap. Ze zijn zoals hieronder:
//1.
for (Map.Entry entry : hm.entrySet()) {
System.out.print("key,val: ");
System.out.println(entry.getKey() + "," + entry.getValue());
}
//2.
Iterator iter = hm.keySet().iterator();
while(iter.hasNext()) {
Integer key = (Integer)iter.next();
String val = (String)hm.get(key);
System.out.println("key,val: " + key + "," + val);
}
//3.
Iterator it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Integer key = (Integer)entry.getKey();
String val = (String)entry.getValue();
System.out.println("key,val: " + key + "," + val);
}
16
Probeer dit met Java 1.4:
for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){
Entry entry = (Entry) entries.next();
System.out.println(entry.getKey() + "/" + entry.getValue());
//...
}
17
De bestelling is altijd afhankelijk van de specifieke kaartimplementatie.
Gebruik van Java & Nbsp; 8 U kunt een van deze gebruiken:
map.forEach((k,v) -> { System.out.println(k + ":" + v); });
of:
map.entrySet().forEach((e) -> {
System.out.println(e.getKey() + " : " + e.getValue());
});
Het resultaat is hetzelfde (dezelfde volgorde). De ingangsinstelling ondersteund door de kaart, zodat u dezelfde bestelling krijgt. De tweede is handig omdat u kunt gebruiken Lambdas, b.v. Als u alleen wilt afdrukken alleen gehele getal-objecten die groter zijn dan 5:
map.entrySet()
.stream()
.filter(e-> e.getValue() > 5)
.forEach(System.out::println);
De onderstaande code toont iteratie via LinkedHashMap en normale HashMap (voorbeeld). Je zult verschil zien in de volgorde:
public class HMIteration {
public static void main(String[] args) {
Map<Object, Object> linkedHashMap = new LinkedHashMap<>();
Map<Object, Object> hashMap = new HashMap<>();
for (int i=10; i>=0; i--) {
linkedHashMap.put(i, i);
hashMap.put(i, i);
}
System.out.println("LinkedHashMap (1): ");
linkedHashMap.forEach((k,v) -> { System.out.print(k + " (#="+k.hashCode() + "):" + v + ", "); });
System.out.println("\nLinkedHashMap (2): ");
linkedHashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
System.out.println("\n\nHashMap (1): ");
hashMap.forEach((k,v) -> { System.out.print(k + " (#:"+k.hashCode() + "):" + v + ", "); });
System.out.println("\nHashMap (2): ");
hashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
}
}
Uitvoer:
LinkedHashMap (1):
10 (#=10):10, 9 (#=9):9, 8 (#=8):8, 7 (#=7):7, 6 (#=6):6, 5 (#=5):5, 4 (#=4):4, 3 (#=3):3, 2 (#=2):2, 1 (#=1):1, 0 (#=0):0,
LinkedHashMap (2):
10 : 10, 9 : 9, 8 : 8, 7 : 7, 6 : 6, 5 : 5, 4 : 4, 3 : 3, 2 : 2, 1 : 1, 0 : 0,
HashMap (1):
0 (#:0):0, 1 (#:1):1, 2 (#:2):2, 3 (#:3):3, 4 (#:4):4, 5 (#:5):5, 6 (#:6):6, 7 (#:7):7, 8 (#:8):8, 9 (#:9):9, 10 (#:10):10,
HashMap (2):
0 : 0, 1 : 1, 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7, 8 : 8, 9 : 9, 10 : 10,
Antwoord 18
Meest compact met Java 8:
map.entrySet().forEach(System.out::println);
Antwoord 19
Als ik een object heb dat de kaartinterface in Java implementeert en ik wil elk paar daarin herhalen, wat is dan de meest efficiënte manier om door de kaart te gaan?
Als efficiëntie van het herhalen van de sleutels een prioriteit is voor uw app, kies dan een Map
-implementatie die de sleutels in de door u gewenste volgorde houdt.
Zal de volgorde van elementen afhangen van de specifieke kaartimplementatie die ik heb voor de interface?
Ja, absoluut.
- Sommige
Map
implementaties beloven een bepaalde iteratievolgorde, andere niet. - Verschillende implementaties van
Map
handhaven een verschillende volgorde van de sleutel-waardeparen.
Zie deze tabel die ik heb gemaakt met een samenvatting van de verschillende Map
-implementaties die zijn gebundeld met Java 11. Let in het bijzonder op de kolom iteratievolgorde. Klik/tik om in te zoomen.
Je kunt zien dat er vier Map
-implementaties zijn die een bestelling handhaven:
TreeMap
ConcurrentSkipListMap
LinkedHashMap
EnumMap
NavigableMap
-interface
Twee van die implementeren de NavigableMap
interface: TreeMap
& AMP; ConcurrentSkipListMap
.
De oudere SortedMap
Interface wordt effectief ingediend door de nieuwere NavigableMap
interface. Maar u kunt alleen implementaties van derden vinden die de oudere interface alleen implementeren.
Natuurlijke bestelling
Als u een Map
die zijn paren bewaarden door de” natuurlijke volgorde “van de sleutel, gebruik TreeMap
of ConcurrentSkipListMap
. De term “natuurlijke bestelling” betekent de klasse van de sleutels implementeert Comparable
. De waarde geretourneerd door de compareTo
methode wordt gebruikt voor vergelijking in sorteren.
Aangepaste bestelling
Als u een aangepaste sorteerroutine wilt opgeven voor uw sleutels die moeten worden gebruikt bij het handhaven van een gesorteerde volgorde, passeert u een Comparator
implementatie geschikt voor de klas van uw sleutels. Gebruik egistral TreeMap
of ConcurrentSkipListMap
, passeren van uw Comparator
.
Originele Insertion Order
Als u wilt dat de paren van uw kaart in hun oorspronkelijke volgorde worden bewaard waarin u ze in de kaart hebt ingevoegd, gebruik dan LinkedHashMap
.
Enum-definitieorder
Als u een ENUM gebruikt, zoals DayOfWeek
of Month
als uw sleutels, gebruik de EnumMap
klasse. Niet alleen is deze klasse zeer geoptimaliseerd om heel weinig geheugen te gebruiken en erg snel te rennen, het handhaaft uw paren in de volgorde die is gedefinieerd door de ENUM. Voor DayOfWeek
, bijvoorbeeld, wordt de sleutel van DayOfWeek.MONDAY
voor het eerst gevonden wanneer herhent, en de sleutel van DayOfWeek.SUNDAY
ZAL ZAL ZIJN .
Overige overwegingen
Overweeg bij het kiezen van een Map
implementatie ook:
- NULL-waarden. Sommige implementaties verbieden/accepteren een NULL als sleutel en/of waarde.
- Gelijktijdigheid. Als u de kaart in verschillende threads manipuleert, moet u een implementatie gebruiken die gelijktijdigheid ondersteunt. Of verpak de kaart met
Collections::synchronizedMap
(minder wenselijk).
Beide overwegingen worden behandeld in de bovenstaande grafische tabel.
Antwoord 20
Als u een generieke, niet-getypte kaart heeft, kunt u het volgende gebruiken:
Map map = new HashMap();
for (Map.Entry entry : ((Set<Map.Entry>) map.entrySet())) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
Antwoord 21
public class abcd{
public static void main(String[] args)
{
Map<Integer, String> testMap = new HashMap<Integer, String>();
testMap.put(10, "a");
testMap.put(20, "b");
testMap.put(30, "c");
testMap.put(40, "d");
for (Integer key:testMap.keySet()) {
String value=testMap.get(key);
System.out.println(value);
}
}
}
OF
public class abcd {
public static void main(String[] args)
{
Map<Integer, String> testMap = new HashMap<Integer, String>();
testMap.put(10, "a");
testMap.put(20, "b");
testMap.put(30, "c");
testMap.put(40, "d");
for (Entry<Integer, String> entry : testMap.entrySet()) {
Integer key=entry.getKey();
String value=entry.getValue();
}
}
}
Antwoord 22
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry element = (Map.Entry)it.next();
LOGGER.debug("Key: " + element.getKey());
LOGGER.debug("value: " + element.getValue());
}
Antwoord 23
U kunt het doen met generieke geneesmiddelen:
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());
}
Antwoord 24
Gebruik Java 8:
map.entrySet().forEach(entry -> System.out.println(entry.getValue()));
Antwoord 25
Een effectieve iteratieve oplossing voor een kaart is een for
-lus van Java 5 tot en met Java 7. Hier is het:
for (String key : phnMap.keySet()) {
System.out.println("Key: " + key + " Value: " + phnMap.get(key));
}
Vanaf Java 8 kunt u een lambda-expressie gebruiken om een kaart te doorlopen. Het is een verbeterde forEach
phnMap.forEach((k,v) -> System.out.println("Key: " + k + " Value: " + v));
Als je een voorwaarde voor lambda wilt schrijven, kun je dat als volgt schrijven:
phnMap.forEach((k,v)->{
System.out.println("Key: " + k + " Value: " + v);
if("abc".equals(k)){
System.out.println("Hello abc");
}
});
26
//Functional Oprations
Map<String, String> mapString = new HashMap<>();
mapString.entrySet().stream().map((entry) -> {
String mapKey = entry.getKey();
return entry;
}).forEach((entry) -> {
String mapValue = entry.getValue();
});
//Intrator
Map<String, String> mapString = new HashMap<>();
for (Iterator<Map.Entry<String, String>> it = mapString.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String> entry = it.next();
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
//Simple for loop
Map<String, String> mapString = new HashMap<>();
for (Map.Entry<String, String> entry : mapString.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
27
Er zijn veel manieren om dit te doen. Hieronder is een paar eenvoudige stappen:
Stel dat u één kaart hebt zoals:
Map<String, Integer> m = new HashMap<String, Integer>();
Dan kunt u iets als het onderstaande doen om te herhalen over kaartelementen.
// ********** Using an iterator ****************
Iterator<Entry<String, Integer>> me = m.entrySet().iterator();
while(me.hasNext()){
Entry<String, Integer> pair = me.next();
System.out.println(pair.getKey() + ":" + pair.getValue());
}
// *********** Using foreach ************************
for(Entry<String, Integer> me : m.entrySet()){
System.out.println(me.getKey() + " : " + me.getValue());
}
// *********** Using keySet *****************************
for(String s : m.keySet()){
System.out.println(s + " : " + m.get(s));
}
// *********** Using keySet and iterator *****************
Iterator<String> me = m.keySet().iterator();
while(me.hasNext()){
String key = me.next();
System.out.println(key + " : " + m.get(key));
}
28
iterating a kaart is heel gemakkelijk .
for(Object key: map.keySet()){
Object value= map.get(key);
//Do your stuff
}
Heb je bijvoorbeeld een Map<String, int> data;
for(Object key: data.keySet()){
int value= data.get(key);
}