HashMap
의 항목을 반복하는 가장 좋은 방법은 무엇입니까?
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
에 대해 더 자세히 읽어보십시오.
키에만 관심이 있다면 맵의 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
참조).
참조에서 추출 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을 사용하십시오.
for (Map.Entry<String, String> item : hashMap.entrySet()) {
String key = item.getKey();
String value = item.getValue();
}
여러 가지 방법으로 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();
더 똑똑한 :
for (String key : hashMap.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
달려있어. 모든 항목의 키와 값이 모두 필요하다고 판단되면 entrySet
을 사용하십시오. 값만 있으면 values()
메서드가 있습니다. 그리고 키가 필요하면 keyset()
을 사용하십시오.
나쁜 연습은 모든 키를 반복하고 루프 내에서 항상 값을 얻기 위해 map.get(key)
을 수행하는 것입니다. 당신이 그렇게한다면, 내가 쓴 첫 번째 옵션은 당신을위한 것입니다.