HashMap
의 항목을 반복하는 가장 좋은 방법은 무엇입니까?
질문자 :burntsugar
키에만 관심이 있는 경우 맵 keySet()
Map<String, Object> map = ...; for (String key : map.keySet()) { // ... }
값만 필요한 경우 values()
.
for (Object value : map.values()) { // ... }
마지막으로 키와 값을 모두 원하면 entrySet()
.
for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // ... }
한 가지 주의 사항: 반복 중에 항목을 제거하려면 Iterator를 통해 제거해야 합니다( karim79의 답변 참조). 그러나 항목 값을 변경하는 것은 괜찮습니다(Map.Entry
참조).
harto
다음과 같이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
에 대해 자세히 알아보세요.
karim79
Java에서 맵을 반복하는 방법 참조에서 추출:
Java Map
을 반복하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법을 살펴보고 장단점을 검토해 보겠습니다. Java의 모든 맵은 Map 인터페이스를 구현하므로 다음 기술은 모든 맵 구현( HashMap
, TreeMap
, LinkedHashMap
, Hashtable
등)에 대해 작동합니다.
방법 #1 : For-Each 루프를 사용하여 항목을 반복합니다.
이것은 가장 일반적인 방법이며 대부분의 경우 선호됩니다. 루프에 맵 키와 값이 모두 필요한 경우 사용해야 합니다.
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()); }
For-Each 루프는 Java 5에서 도입되었으므로 이 방법은 최신 버전의 언어에서만 작동합니다. 또한 For-Each 루프 NullPointerException
발생시키므로 반복하기 전에 항상 null 참조를 확인해야 합니다.
방법 #2 : For-Each 루프를 사용하여 키 또는 값을 반복합니다.
맵의 키 또는 값만 필요한 경우 entrySet 대신 keySet 또는 값을 반복할 수 있습니다.
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); }
entrySet
반복(약 10% 더 빠름)보다 약간의 성능 이점을 제공하고 더 깨끗합니다.
방법 #3 : Iterator를 사용하여 반복합니다.
제네릭 사용:
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()); }
제네릭 없이:
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
또는 값을 반복할 수도 있습니다.
이 방법은 중복되어 보일 수 있지만 나름의 장점이 있습니다. 우선, 이전 버전의 Java에서 맵을 반복하는 유일한 방법입니다. iterator.remove()
를 호출하여 반복하는 동안 맵에서 항목을 제거할 수 있는 유일한 방법이라는 것입니다. For-Each 반복 중에 이 작업을 시도하면 Javadoc 에 따라 "예측할 수 없는 결과"를 얻게 됩니다.
성능 관점에서 이 방법은 For-Each 반복과 같습니다.
방법 #4 : 키를 반복하고 값을 검색합니다(비효율적).
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); }
이것은 방법 #1에 대한 더 깨끗한 대안처럼 보일 수 있지만 실제로는 키로 값을 가져오는 데 시간이 많이 걸릴 수 있으므로 매우 느리고 비효율적입니다(다른 Map 구현에서 이 방법은 방법 #1보다 20%-200% 느립니다. ). FindBugs가 설치되어 있으면 이를 감지하고 비효율적인 반복에 대해 경고합니다. 이 방법은 피해야 합니다.
결론:
맵의 키 또는 값만 필요한 경우 방법 #2를 사용합니다. 이전 버전의 Java(5 미만)를 사용 중이거나 반복 중에 항목을 제거하려는 경우 방법 #3을 사용해야 합니다. 그렇지 않으면 방법 #1을 사용하십시오.
arvind
for (Map.Entry<String, String> item : hashMap.entrySet()) { String key = item.getKey(); String value = item.getValue(); }
gabor
여러 가지 방법으로 Map
의 항목을 반복할 수 있습니다. 다음과 같이 각 키와 값을 가져옵니다.
Map<?,?> map = new HashMap<Object, Object>(); for(Entry<?, ?> e: map.entrySet()){ System.out.println("Key " + e.getKey()); System.out.println("Value " + e.getValue()); }
또는 다음을 사용하여 키 목록을 얻을 수 있습니다.
Collection<?> keys = map.keySet(); for(Object key: keys){ System.out.println("Key " + key); System.out.println("Value " + map.get(key)); }
모든 값을 가져오고 키에는 관심이 없는 경우 다음을 사용할 수 있습니다.
Collection<?> values = map.values();
codethulhu
더 똑똑해:
for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); }
jkarretero
달려있다. 모든 항목의 키와 값이 모두 필요하다는 것을 알고 있다면 entrySet
이동하십시오. 값만 필요한 경우 values()
메서드가 있습니다. 키만 필요한 경우에는 keyset()
을 사용하십시오.
나쁜 습관은 모든 키를 반복한 다음 루프 내에서 항상 map.get(key)
를 수행하여 값을 가져오는 것입니다. 당신이 그렇게하고 있다면, 내가 쓴 첫 번째 옵션은 당신을위한 것입니다.
Gary Kephart
출처 : http:www.stackoverflow.com/questions/1066589/iterate-through-a-hashmap
'etc. > StackOverFlow' 카테고리의 다른 글
필요한 경우 소수점 이하 2자리 이하로 반올림하는 방법은 무엇입니까? (0) | 2021.10.06 |
---|---|
셸 스크립트에서 JSON을 예쁘게 인쇄하려면 어떻게 해야 합니까? (0) | 2021.10.06 |
파이썬에서 현재 시간을 얻는 방법 (0) | 2021.10.06 |
특정 Git 브랜치를 복제하려면 어떻게 해야 합니까? [복제하다] (0) | 2021.10.06 |
AngularJS: 서비스 대 공급자 대 공장 (0) | 2021.10.06 |