본문 바로가기
프로그래밍/Java

[Java] HashMap Value 기준으로 정렬

by so5663 2023. 1. 24.

먼저 map을 정렬하기 위해서 여러가지 방법이 있는데

저는 Collections.sort()를 사용하는 방법 3가지를 설명하겠습니다.

 

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());

Collections.sort()를 사용하기 위해서는 Map을 List형태로 변환해야 한다.

 

Map.entrySet()을 이용하여 아래와 같이 Map의 Entry Set을 List 형태로 저장한다.

 

자바에서 Map.Entry 는 Map 형태의 인터페이스를 만드는데 사용하는데 Map을 For 문에서 돌려줄 경우

인터페이스 용도로 사용하거나 혹은스트림(Stream) 사용 시 Map 형식의 데이터에서 처리가

필요할 때 Map.Entry를 사용하여 처리하게 됩니다.

 

comparingByValue 사용 정렬

List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());

entryList.sort(Map.Entry.comparingByValue());

for(Map.Entry<String, Integer> entry : entryList){
    System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}

//key : a, value : 1
//key : b, value : 2
//key : c, value : 3

이방법은 간단하지만 뭔가 마음에 들지 않습니다.

 

저는 주로 map을 정렬할때 comparator 사용을 합니다.

List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());

entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
	return o1.getValue() - o2.getValue(); //오름 차순
    }
});

for(Map.Entry<String, Integer> entry : entryList){
    System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}

또한 Comparator를 이용하므로 아래와 같이 o1과 o2의 순서를 바꾸어 내림차순으로 정렬을 할 수도 있다.

ex) return o1.getValue() - o2.getValue();

 

또 이런식으로도 사용이 가능하다.

@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
    if(o2.getValue() > o1.getValue()) return 1;
    else if(o2.getValue() < o1.getValue()) return -1;
    else return 0;
}

 

 

자세한것은 2023.01.11 - [프로그래밍/Java] - Java Comparable, Comparator

 

Java Comparable, Comparator

public class Main { public static void main(String[] args) { int a = 3, b = 5; System.out.println(a > b); System.out.println(a < b); String str1 = "abc", str2 = "abc"; System.out.println(str1.equals(str2)); } } 이런식으로 primitive type은 자바 자

soso-shs.tistory.com

제가 이전에 작성한 글을 참고하시면 됩니다.

 

람다 함수 사용

위에 사용한 comparator를 아래와 같이 람다 함수로 구현할 수도 있다. 역시 같은 방법으로 내림차순 정렬 역시 가능하다.

List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(((o1, o2) -> map.get(o1.getKey()) - map.get(o2.getKey())));
for(Map.Entry<String, Integer> entry : entryList){
    System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}

//key : a, value : 1
//key : b, value : 2
//key : c, value : 3