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
Post a Comment