728x90
반응형
Map의 Value데이터 기준으로 정렬하기
TreeSet을 이용하면 Key 기준으로 쉽게 정렬할 수 있으나, Value로 정렬해주는 컬렉션은 존재하지 않는다.
Value로 map을 정렬을 하려면 Comparator 인터페이스를 이용해야 한다.
밑에 예제는 Value를 기준으로 내림차순으로 정렬을 하고, Value가 같다면 Key를 기준으로 오름차순으로 정렬하는 예제이다.
package sort;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class MapSortTest {
public static void main(String[] args){
Map<String, Integer> map = new HashMap<>();
map.put("A", 4);
map.put("B", 4);
map.put("C", 4);
map.put("D", 2);
map.put("E", 6);
map.put("F", 1);
map.put("G", 2);
// value 내림차순으로 정렬하고, value가 같으면 key 오름차순으로 정렬
List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
int comparision = (o1.getValue() - o2.getValue()) * -1;
return comparision == 0 ? o1.getKey().compareTo(o2.getKey()) : comparision;
}
});
// 순서유지를 위해 LinkedHashMap을 사용
Map<String, Integer> sortedMap = new LinkedHashMap<>();
for(Iterator<Map.Entry<String, Integer>> iter = list.iterator(); iter.hasNext();){
Map.Entry<String, Integer> entry = iter.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println(sortedMap);
}
}
-- result --
{E=6, A=4, B=4, C=4, D=2, G=2, F=1}
익명클래스 Comparator를 구현하여 sort메소드에 전달
=> 내림차순 정렬이기 때문에 value를 비교하여 -1 을 곱해주었고, value가 같을 경우 Key값의 오름차순으로 정렬하는 Compare메소드를 구현
728x90
반응형
'그 외 ... (정리해야함) > 꿀팁' 카테고리의 다른 글
[Java] String to InputStream(String을 InputStream으로 변환) (0) | 2019.02.27 |
---|---|
SQL Developer 에서 MS-SQL 접속하기 (0) | 2018.11.07 |
[JAVA] split 메서드 실수하기 쉬운 것 (1) | 2018.08.24 |
웹애플리케이션 아키텍처 (0) | 2018.08.06 |
[Gson] json unicode 문제해결 (0) | 2018.05.28 |