-
Sort a Map<Key, Value> by valuesLanguage/Java 2020. 4. 3. 15:34
다른 언어인 JavaScript나 Python같은 경우엔, 객체 혹은 딕셔너리로 구성되어 있어서 value로 key를 정렬하는 게 어려운 일이 아니다. 하지만 Java에선 Map을 통해 Key - Value를 구성해야하는데, 문제는 마땅한 API가 없다는 것이다. 결국 StackOverflow를 뒤지다가 원하는 대답을 얻었다.
https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values?page=1&tab=votes#tab-top
크게 세 가지 방법이 있다.
1. Map.Entry와 해당 인터페이스의 메서드인 comparingByValue를 이용하는 방법
2. Comparator 인터페이스를 상속(implements)받고, compare 메서드를 구현하여 비교하는 방법
3. Java 8부터 가능한 Stream을 활용한 방법으로, 위 첫 번째 방법과 유사하게 동작한다.
위 세 가지 방법을 각각 연습해 본 결과, 1번이 확실히 많은 인정을 받은만큼 가장 이해하기가 쉬웠다.
간단히 구조를 설명하자면, 다음과 같다.
1. Map을 만든다.
2. ArrayList를 만들고, Map.entrySet()을 활용해 List의 인자로 넘겨준다.
(ArrayList 생성자의 경우 Collection을 인자로 받을 수 있다.)
3. List를 정렬하는데, 오름차순으로 정렬할 경우, Map.Entry.comparingByValue()를 comparator로 넘겨준다.
만약 내림차순으로 정렬할 경우, Collection.reverse(Map.Entry.comparingByValue())를 넘겨준다.
4. 그렇게 정렬한 List를 LinkedHashMap의 Key, Value로 할당해주면 된다.Map.entrySet API
Set<Map.Entry<K,V>> entrySet() Returns a Set view of the mappings contained in this map.
Map.Entry.ComparingByValue API
static <K,V extends Comparable<? super V>>
Comparator<Map.Entry<K,V>>comparingByValue() Returns a comparator that compares Map.Entry in natural order on value.
static <K,V> Comparator<Map.Entry<K,V>> comparingByValue(Comparator<? super V> cmp) Returns a comparator that compares Map.Entry by value using the given Comparator.
Collections.reverseOrder API
static <T> Comparator<T> reverseOrder() Returns a comparator that imposes the reverse of the natural ordering on a collection of objects that implement the Comparable interface.
static <T> Comparator<T> reverseOrder(Comparator<T> cmp) Returns a comparator that imposes the reverse ordering of the specified comparator.
1, 2번을 구성하고 활용할 줄 알면, 3번은 후에 람다식을 공부하고 나서 활용할 수 있을 듯 하다.
'Language > Java' 카테고리의 다른 글
다형성(Polymorphism) - 부모와 그 자식에 관하여(상속) (0) 2020.04.04