Java & Android

Java Map 활용

그레이트쪼 2017. 1. 10. 19:59
  • Map iteration 하기

1. Entry 이용하기

1
2
3
4
for (Map.Entry<StringString> entry : mMap.entrySet())
{
    System.out.println(entry.getKey() + "/" + entry.getValue());
}


2. Iterator 이용하기

1
2
3
4
5
Iterator<Entry<StringString> iter = myMap.entrySet().iterator();
while (iter.hasNext()) {
    Entry<StringString> entry = iter.next();
    System.out.println(entry.getKey() + "/" + entry.getValue());
}


  • Map으로부터 value의 List 뽑아내기
    • Map의 values() 메소드를 사용한다
1
List<Value> list = new ArrayList<Value>(map.values());


  • Map의 특정 element update하기
    • 그냥 같은 key로 put하면 기존 값이 update됨. Don't worry~

  • Map의 특정 element delete하기
    • 첫 번째 iteration 방법 (Entry를 이용하기)으로 remove하는 코드를 작성하면
1
2
3
4
for (Map.Entry<StringString> entry : mMap.entrySet())
{
    mMap.remove(entry.getKey());
}

java.util.ConcurrentModificationException이 발생한다.

"Exception in thread "main" java.util.ConcurrentModificationException

    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)

    at java.util.HashMap$EntryIterator.next(Unknown Source)

    at java.util.HashMap$EntryIterator.next(Unknown Source)"

    • 따라서 두 번째 iteration 방법 (Iterator 이용하기)으로 remove하는 코드를 작성해야 한다. 
1
2
3
4
Iterator<Entry<StringString> iter = myMap.entrySet().iterator();
while (iter.hasNext()) {
    iter.remove();
}

첫 번째 방법도 사실 내부적으로 iterator를 사용하는데 iterator가 map의 수정이 발생한 것을 detect 했을 때 예외를 발생시킨다. 두 번째 방법은 iterator를 통해서 remove를 했기 때문에 예외가 발생하지 않는 것이다.