Map을 순서대로 넣고 싶을 때 LinkedHashMap을 사용하는 방법.


Map을 순서대로 넣고 싶을 때 LinkedHashMap을 사용하는 방법.

문제상황: 다음과 같이 HashMap 사용하여 key, value값을 순서대로 입력을 하였다.
Map<String, Integer> fruitPriceMap = new HashMap<String, Integer>();

fruitPriceMap.put("Apple",      1200);
fruitPriceMap.put("Strawberry", 1400);
fruitPriceMap.put("Grape",      1500);
fruitPriceMap.put("Banana",     1000);
fruitPriceMap.put("Melon",      1800);
fruitPriceMap.put("Peach",      2000);
이후 다음과 같은 코드를 작성하여 hashMap 입력한 순서대로 key, value값을 출력하고 싶었다.
for(String key : fruitPriceMap.keySet()){
System.out.println("key:" + key + ", value:" + fruitPriceMap.get(key));
}

내가 원했던 결과는 다음과 같았다.
key:Apple, value:1200
key:Strawberry, value:1400
key:Grape, value:1500
key:Banana, value:1000
key:Melon, value:1800
key:Peach, value:2000

하지만 실제 결과는,
key:Apple, value:1200
key:Strawberry, value:1400
key:Grape, value:1500
key:Peach, value:2000
key:Banana, value:1000
key:Melon, value:1800
내가 원했던 입력한 순서대로 출력이 이루어지지 않았다.

원인: HashMap 다음과 같은 특성이 있다. 중복 key 허용하지 않는다는 점과, 순서에 상관없이 key, value값을 가져온다는 점이다아무래도 HashMap key 기반의 자료구조이기 때문에, 저장 순서를 중요하다. 그래서 저장한 데이터를 출력해보면 입력했던 순서와는 전혀 다른 형태의 모습으로 여기저기 흩어져 있는 형태의 결과를 출력하는 것이다. 그렇다면, HashMap 출력하는 순서의 기준은 무엇일까? 바로 HashCode이다. HashMap 내부 Hash 값에 따라 키순서가 정해진다. 그러면, 이러한 HashMap 형태의자료구조에서 마치 ArrayList처럼 입력 순서에 따라 출력하려면 어떻게 해야 할까?

해결책:  LinkedHashMap 사용하면 된다.
LinkedHashMap HashMap 특징을 가짐과 동시에, 입력 순서대로 마치 ArrayList처럼 element들을 뽑아올 있다.

코드:
Map<String, Integer> fruitPriceMap = new LinkedHashMap<String, Integer>();

fruitPriceMap.put("Apple",      1200);
fruitPriceMap.put("Strawberry", 1400);
fruitPriceMap.put("Grape",      1500);
fruitPriceMap.put("Banana",     1000);
fruitPriceMap.put("Melon",      1800);
fruitPriceMap.put("Peach",      2000);

코드실행결과:
key:Apple, value:1200
key:Strawberry, value:1400
key:Grape, value:1500
key:Banana, value:1000
key:Melon, value:1800
key:Peach, value:2000


Comments

Popular posts from this blog

$$ Regular Expression이 안먹는 경우

exception in thread main java.lang.unsupportedclassversionerror unsupported major.minor version 52.0

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver