먼저 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
제가 이전에 작성한 글을 참고하시면 됩니다.
람다 함수 사용
위에 사용한 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
'프로그래밍 > Java' 카테고리의 다른 글
자바로 OpenAPI로 받은 XML 데이터 파싱하기 (0) | 2023.06.13 |
---|---|
[JAVA] Map for-each 정리 (0) | 2023.06.08 |
Java Comparable, Comparator (0) | 2023.01.11 |
[JAVA] Multi Thread 환경에서 Singleton 패턴을 Thread Safe 하게 만들기 (0) | 2022.11.19 |
Java 자바 String join (0) | 2022.03.14 |