Prologue

Java에서 HashMap을 사용하면서 정렬이 필요할 때, 어떻게 정렬해야 하는지에 대해 정리한다.

Subject

알고리즘 문제를 풀다가 가끔 Map을 정렬해야 하는 경우가 발생한다. Key 값을 기준으로 정렬할 경우에는 TreeMap을 사용하면 가능하다. 단, 객체의 특정 인스턴스 변수를 기준으로 정렬하고 싶다면 Comparable을 이용한 정렬이 필요하다.

이번에는 HashMap을 이용해서 Key, Value 기준으로 정렬하는 방법을 알아보려고 한다.

[Value를 기준으로 정렬]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;

/**
* created by victory_woo on 2020/11/10
*/
public class MapSortingTest {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 65);
map.put("C", 67);
map.put("D", 68);
map.put("B", 66);

List<String> keySet = new ArrayList<>(map.keySet());

// Value 기준으로 내림차순 정렬.
keySet.sort((o1, o2) -> map.get(o2) - map.get(o1));
System.out.println("==내림차순 정렬==");
for (String key : keySet) {
System.out.println(String.format("Key : %s, Value : %s", key, map.get(key)));
}

// Value 기준으로 오름차순 정렬.
System.out.println("==오름차순 정렬==");
keySet.sort((o1, o2) -> map.get(o1) - map.get(o2));
for (String key : keySet) {
System.out.println(String.format("Key : %s, Value : %s", key, map.get(key)));
}
}
}

[결과]

1
2
3
4
5
6
7
8
9
10
==내림차순 정렬==
Key : D, Value : 68
Key : C, Value : 67
Key : B, Value : 66
Key : A, Value : 65
==오름차순 정렬==
Key : A, Value : 65
Key : B, Value : 66
Key : C, Value : 67
Key : D, Value : 68

[Key를 기준으로 정렬]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;

/**
* created by victory_woo on 2020/11/10
*/
public class MapSortingTest {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 65);
map.put("C", 67);
map.put("E", 90);
map.put("D", 68);
map.put("B", 66);
map.put("Z", 1);

List<String> keySet = new ArrayList<>(map.keySet());

System.out.println("==Key 값 기준으로 오름차순 정렬==");
List<String> keys = new ArrayList<>(map.keySet());
Collections.sort(keys);
for (String key : keys) {
System.out.println(String.format("Key : %s, Value : %s", key, map.get(key)));
}

keys.sort(Collections.reverseOrder());

System.out.println("==Key 값 기준으로 내림차순 정렬==");
for (String key : keys) {
System.out.println(String.format("Key : %s, Value : %s", key, map.get(key)));
}
}
}

[결과]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
==Key 값 기준으로 오름차순 정렬==
Key : A, Value : 65
Key : B, Value : 66
Key : C, Value : 67
Key : D, Value : 68
Key : E, Value : 90
Key : Z, Value : 1
==Key 값 기준으로 내림차순 정렬==
Key : Z, Value : 1
Key : E, Value : 90
Key : D, Value : 68
Key : C, Value : 67
Key : B, Value : 66
Key : A, Value : 65

Key 값으로 정렬이 필요한 경우라면, HashMap보다는 TreeMap을 사용하는 편이 낫다. 그래도 한번 알아두면 나중에 필요할 때, 유용하게 사용할 수 있다고 생각하므로 꼭 익혀두길 바란다!

Ref