Iteracija per HashMap

Galimas dublikatas:
Kaip efektyviai rūšiuoti kiekvieną įrašą „žemėlapyje“?

Koks yra geriausias būdas HashMap per „ HashMap elementus?

2987
01 июля '09 в 2:24 2009-07-01 02:24 burntsugar yra nustatytas 01 liepa '09, 2:24 2009-07-01 02:24
@ 7 atsakymai

entrySet() pagal entrySet() kaip šis:

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

Sužinokite daugiau apie Map .

2954
01 июля '09 в 2:27 2009-07-01 02:27 atsakymą pateikė karim79 liepos 01 '09, 2:27 2009-07-01 02:27

Jei jus domina tik raktai, galite keySet() per keySet() žemėlapyje:

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

Jei jums reikia tik vertybių, naudokite values() :

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

Galiausiai, jei norite ir raktą, ir vertę, naudokite entrySet() :

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

Vienas įspėjimas: jei norite pašalinti vidutinius iteracijos elementus, tai reikia padaryti per Iterator (žr. Atsakymą karim79 ). Tačiau keičiant elementų reikšmes (žr. Map.Entry ).

4301
01 июля '09 в 2:28 2009-07-01 02:28 atsakymą pateikė harto liepos 1 d. , 09:28, 2009-07-01 02:28

Ištraukta iš nuorodos Žemėlapio iteracija Java :

„Java“ yra keli būdai kartoti per Map . Pažvelkime į dažniausiai naudojamus metodus ir apsvarstykime jų privalumus bei trūkumus. Kadangi visi „Java“ žemėlapiai įdiegia žemėlapio sąsają, bet kokiam žemėlapio diegimui bus naudojami šie metodai („ HashMap , „ TreeMap , „ LinkedHashMap , „ Hashtable ir kt.)

1 metodas : įrašykite įrašus naudodami „For-Each“ kilpą.

Tai yra labiausiai paplitęs metodas ir daugeliu atvejų yra pageidautinas. Jis turėtų būti naudojamas, jei reikia ciklo raktų ir vertybių.

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

Atkreipkite dėmesį, kad „For-Every“ kilpa buvo įdiegta „Java 5“, todėl šis metodas veikia tik naujesnėse kalbos versijose. Be to, „For-Each“ kilpa išmeta „ NullPointerException jei bandysite kartoti per žemėlapį, kuris yra nulinis, todėl prieš iteravimą visada turėtumėte patikrinti nulinę nuorodą.

2 metodas : Iterate per raktus arba reikšmes naudodami „For-Each“ kilpą.

Jei iš žemėlapio reikia tik raktų ar vertybių, vietoj įrašo rinkinio galite kartoti per raktų ar vertybių rinkinį.

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

Šis metodas turi nedidelį pranašumą prieš entrySet (maždaug 10% greičiau) ir švaresnį.

3 metodas : Iteracija naudojant Iterator.

Generinių vaistų naudojimas:

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

Be generikų:

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

Taip pat galite naudoti tą patį metodą kartoti per keySet arba reikšmes.

Šis metodas gali būti nereikalingas, tačiau jis turi savo privalumų. Visų pirma, tai yra vienintelis būdas kartoti žemėlapį senesnėse „Java“ versijose. Kitas svarbus bruožas yra tai, kad jis yra vienintelis būdas, leidžiantis ištrinti įrašus iš žemėlapio iteracijos metu, paskambinę iterator.remove() . Jei bandysite tai padaryti per kiekvieną iteraciją, pagal „ Javadoc “ gausite „nenuspėjamus rezultatus“.

Kalbant apie našumą, šis metodas yra lygus kiekvienam Iteravimui.

4 metodas : klaviatūros iteracija ir vertybių paieška (neveiksminga).

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

Tai gali atrodyti kaip švaresnė alternatyva metodui Nr. 1, tačiau praktiškai tai yra gana lėta ir neveiksminga, nes verčių panaudojimas raktu gali užtrukti ilgai (šis metodas yra 20% -200% lėtesnis skirtingose ​​žemėlapio realizacijose nei metodas Nr. 1). Jei įdiegėte „FindBugs“, tai aptiks tai ir įspės apie neveiksmingą iteraciją. Šį metodą reikėtų vengti.

Išvada:

Jei jums reikia tik žemėlapio raktų ar reikšmių, naudokite # 2 metodą. Jei įstrigo senoji „Java“ versija (mažiau nei 5) arba planuojate ištrinti įrašus iteracijos metu, turėtumėte naudoti # 3 metodą. Priešingu atveju naudokite # 1 metodą.

770
08 дек. atsakymas pateikiamas arvind 08 dec. 2011-12-08 17:19 '11, 17:19, 2011-12-08 17:19
 for (Map.Entry<String, String> item : params.entrySet()) { String key = item.getKey(); String value = item.getValue(); } 
101
23 июля '11 в 4:28 2011-07-23 04:28 atsakymą gaboras pateikė liepos 23 d. 11 d. 4:28 2011-07-23 04:28

Galite kartoti daugiau įrašų Map . Gaukite kiekvieną raktą ir vertę taip:

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

Arba galite gauti raktų sąrašą su

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

Jei norite gauti visas vertes ir nesusiję su raktais, galite naudoti:

 Collection<?> values = map.values(); 
83
01 июля '09 в 2:43 2009-07-01 02:43 atsakymas pateikiamas koduotu: liepos 01'09 , 2:43 2009-07-01 02:43

Protingesni:

 for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } 
57
11 авг. atsakymas, kurį pateikė jkarretero 11 rug . 2010-08-11 13:01 '10, 13:01, 2010-08-11 13:01

Tai priklauso nuo. Jei žinote, kad jums reikės tiek raktų, tiek kiekvieno įrašo vertės, eikite į entrySet . Jei jums reikia tik vertybių, tada yra values() metodas. Ir jei jums reikia tik raktų, naudokite keyset() .

Bloga praktika būtų map.get(key) per visus raktus, o tada kilpoje visada sukurkite map.get(key) kad gautumėte vertę. Jei tai padarysite, pirmasis variantas, kurį parašiau, yra jums.

42
01 июля '09 в 2:29 2009-07-01 02:29 atsakymą pateikė Gary Kephart liepos 1 d., 09:29 2009-07-01 02:29