etc./StackOverFlow

HashMap을 통해 반복

청렴결백한 만능 재주꾼 2021. 10. 6. 03:01
반응형

질문자 :burntsugar


HashMap 의 항목을 반복하는 가장 좋은 방법은 무엇입니까?



키에만 관심이 있는 경우 맵 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

반응형