HashMap vasitəsilə yineleme

Mümkün dublikat:
"Xəritədə" hər bir girişdən effektiv olaraq necə sıralana bilərəm?

HashMap maddələr vasitəsilə HashMap ən yaxşı yolu HashMap ?

2987
01 июля '09 в 2:24 2009-07-01 02:24 burntsugar 01 iyul '09 saat 02: 24-də təyin olunub
@ 7 cavab

entrySet() ilə entrySet() :

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

Map haqqında daha çox məlumat əldə edin.

2954
01 июля '09 в 2:27 2009-07-01 02:27 Cavab karim79 tərəfindən verilir 01 iyul '09 2:27 2009-07-01 02:27

Yalnız düymələrlə maraqlandığınız halda, xəritədə keySet() vasitəsilə keySet() bilərsiniz:

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

Yalnız dəyərlərə ehtiyacınız varsa, values() istifadə edin values() :

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

Nəhayət, hər entrySet() bir əsas və dəyər istəyirsinizsə, entrySet() istifadə edin:

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

Bir xəbərdarlıq: orta ittifaq elementlərini aradan qaldırmaq istəsəniz, bunu İterator vasitəsilə etmək lazımdır (bax cevap karim79 ). Bununla birlikdə elementlərin dəyərlərini sırası ilə dəyişir ( Map.Entry baxın).

4301
01 июля '09 в 2:28 2009-07-01 02:28 cavab 01.07.2009 02:28 'da harto tərəfindən verilmişdir 2009-07-01 02:28

Bağlantıdan çıxarılan Map iTransition in Java :

Java'da bir Map üzərində yineleme üçün bir neçə yol vardır. Ən ümumi üsullara nəzər salaq və onların üstünlüklərini və mənfi cəhətlərini nəzərdən keçirək. Java'daki bütün xəritələr Xəritə interfeysini tətbiq HashMap , hər hansı bir xəritə tətbiq üçün aşağıdakı üsullar ( HashMap , TreeMap , LinkedHashMap , Hashtable , və s.) İstifadə ediləcək.

Metod # 1 : Bir For-Hər loop istifadə edərək qeydləri yineleyin.

Bu ən ümumi metoddur və əksər hallarda üstünlük təşkil edir. Bir döngədə həm xəritə düymələri, həm də dəyərlərə ehtiyacınız varsa istifadə olunmalıdır.

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

Hər bir loopun Java 5-də tətbiq olunduğunu nəzərə alsaq, bu üsul yalnız dilin yeni versiyalarında işləyir. Ayrıca, hər bir loop NullPointerException , null olan bir xəritə üzərində yinelemeye NullPointerException , yəqin ki, təkrarlamadan əvvəl null istinadları yoxlayın.

Metod # 2 : Hər bir döngəni istifadə edərək düymələri və ya dəyərləri yineleyin.

Bir xəritədən yalnız düymələrə və ya dəyərlərə ehtiyac varsa, entrySet yerinə bir sıra düymələr və ya dəyərlər üzərində yineleyə bilərsiniz.

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

Bu üsul entrySet iteration (təxminən 10% daha sürətli) və daha təmiz bir üstünlük üstünlüyünə malikdir.

Metod # 3 : Iterator istifadə edərək yineleme.

Generics istifadə:

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

Generics olmadan:

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

keySet və ya dəyərlər üzərində təkrarlamaq üçün eyni üsuldan da istifadə edə bilərsiniz.

Bu üsul zəif görünə bilər, lakin onun üstünlükləri var. Əvvəla, bu, Java-nın köhnə versiyalarında xəritəni təkrarlamaq üçün yeganə yoldur. Başqa bir mühüm xüsusiyyət isə iterator.remove() funksiyasını çağıraraq təkrarlanma zamanı xəritədən silmək üçün imkan verən yeganə üsuldur. Hər bir iteration zamanı bunu etməyə çalışarsanız Cavadoc'a görə "gözlənilməz nəticələr" əldə edəcəksiniz.

Performans baxımından, bu üsul For-Her İterasyona bərabərdir.

Metod # 4 : Klaviatura təkrarlama və dəyərlər üçün axtarış (effektiv).

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

Bu, 1 nömrəli metod üçün daha təmiz bir alternativ kimi görünə bilər, amma praktikada çox yavaş və səmərəsizdir, çünki əsas istifadə edərək, uzunmüddətli vaxt tələb oluna bilər (bu üsul, üsulun heç birindən fərqli olaraq, Xəritədə fərqli tətbiqlərdə 20% -200% -dir) 1). FindBugs yüklü varsa, bu aşkar və səmərəsiz iteration haqqında sizi xəbərdar edəcək. Bu üsuldan qaçınmaq lazımdır.

Nəticə:

Xaricdən yalnız düymələr və ya dəyərlər lazımdırsa, # 2 üsulunu istifadə edin. Köhnə Java versiyası (5-dən az) ilə sıxılmış və ya təkrarlama zamanı qeydləri silmək planlaşdırırsanız, # 3 üsulunu istifadə etməlisiniz. Əks halda, # 1 metodu istifadə edin.

770
08 дек. cavab 08 dekabrda verilir . 2011-12-08 17:19 '11 at 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 cavab 23 iyul 'da saat 4:28' da gabor tərəfindən verilmişdir 2011-07-23 04:28

Bir xəritədə bir neçə yolla qeydlər üzərində yineleyebilirsiniz. Hər bir əsas və dəyəri aşağıdakı kimi əldə edin:

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

Və ya ilə bir düyməsini bir siyahısını əldə edə bilərsiniz

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

Yalnız bütün dəyərləri almaq və düymələrlə əlaqəli olmadıqda, istifadə edə bilərsiniz:

 Collection<?> values = map.values(); 
83
01 июля '09 в 2:43 2009-07-01 02:43 Cavab codethulhu tərəfindən verilir 01 iyul '09 2:43 2009-07-01 02:43

Daha ağıllı:

 for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } 
57
11 авг. ckrertero tərəfindən verilmiş cavab 11 av . 2010-08-11 13:01 '10 at 13:01 2010-08-11 13:01

Bu asılıdır. Hər bir girişin açarını və dəyərinin lazım olacağını entrySet , entrySet . Yalnız dəyərlərə ehtiyacınız varsa, bir values() üsulu var. Və yalnız düymələrə ehtiyacınız varsa, keyset() istifadə edin.

Kötü bir təcrübə, bütün düymələri map.get(key) olar, sonra bir döngədə hər zaman bir map.get(key) dəyərini almaq üçün edirlər. Bunu etsəniz, yazdığım ilk variant sizin üçündür.

42
01 июля '09 в 2:29 2009-07-01 02:29 Cavab Gary Kephart tərəfindən 01.07.2009 02:29 'da 02.07' də verilir

bağlı digər suallar və ya bir sual