it-swarm.dev

HashMap 반복하기

중복 가능 :
'지도'의 각 항목을 효율적으로 반복하는 방법은 무엇입니까?

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

3108
burntsugar

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 에 대해 더 자세히 읽어보십시오.

3067
karim79

키에만 관심이 있다면 맵의 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();
    // ...
}

한 가지주의 사항 : 중간 반복 항목을 제거하려면 반복자 ( karim79의 대답 참조)를 통해 항목을 제거해야합니다. 그러나 항목 값을 변경하는 것은 괜찮습니다 ( Map.Entry 참조).

4435
harto

참조에서 추출 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 루프는 null 인 맵을 반복 할 경우 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 % 빨라짐)보다 약간의 성능 이점을 제공하며보다 깨끗합니다.

Method # 3 : Iterator를 사용하여 반복.

Generics 사용 :

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을 사용하십시오.

797
arvind
for (Map.Entry<String, String> item : hashMap.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}
129
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();
90
codethulhu

더 똑똑한 :

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}
63
jkarretero

달려있어. 모든 항목의 키와 값이 모두 필요하다고 판단되면 entrySet을 사용하십시오. 값만 있으면 values() 메서드가 있습니다. 그리고 키가 필요하면 keyset()을 사용하십시오.

나쁜 연습은 모든 키를 반복하고 루프 내에서 항상 값을 얻기 위해 map.get(key)을 수행하는 것입니다. 당신이 그렇게한다면, 내가 쓴 첫 번째 옵션은 당신을위한 것입니다.

45
Gary Kephart