Java Map 값으로 정렬하기

JavaBeginner
지금 연습하기

소개

Java 에서 Map 은 기본적으로 정렬되지 않으며, key-value 형식으로 데이터를 저장합니다. 값에 따라 결정을 내리기 위해 값을 기준으로 정렬해야 하는 경우가 많습니다. 이 단계별 Lab 에서는 Java Map 을 값 기준으로 정렬하는 방법을 배우겠습니다.

Java 에서 Map 생성하기

먼저, Java 에서 Map 을 정렬하는 방법을 이해하기 위해 학생들의 이름과 키 (cm) 를 담은 Map 을 생성하겠습니다.

import java.util.*;

public class MapSortingDemo {
    public static void main(String args[]) {
        Map<String, Integer> students = new HashMap<>();
        students.put("Student 1", 159);
        students.put("Student 2", 147);
        students.put("Student 3", 183);
        students.put("Student 4", 167);
        students.put("Student 5", 173);
    }
}

값을 기준으로 Map 정렬하기

값을 기준으로 Map 을 정렬하려면 Map.entrySet()에서 List 를 생성해야 합니다. 이 메서드는 Map 에서 모든 key-value 쌍을 반환합니다. Comparator 함수는 특정 집합을 여러 매개변수에 따라 정렬해야 할 때 사용됩니다. Comparator 함수에서 return student1.getValue().compareTo(student2.getValue());는 정렬 방식을 결정합니다. 즉, 값을 기준으로 정렬하며, 이는 Map 을 값 기준으로 정렬합니다.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

Collections.sort(studentList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2) {
        return student1.getValue().compareTo(student2.getValue());
    }
});

값 기준으로 정렬된 Map 표시하기

정렬된 Map 을 콘솔에 표시합니다.

for (Map.Entry<String, Integer> student : studentList) {
    System.out.println(student.getKey() + " " + student.getValue());
}

Lambda Expression 을 사용한 Map 정렬

Lambda 표현식을 사용하여 값을 기준으로 Map 을 정렬할 수도 있습니다. 이는 더 짧고 효율적인 방법입니다.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

studentList.sort((student1, student2) -> student1.getValue().compareTo(student2.getValue()));

Lambda Expression 을 사용하여 값 기준으로 정렬된 Map 표시

정렬된 Map 을 콘솔에 표시합니다.

studentList.forEach(student -> System.out.println(student.getKey() + " " + student.getValue()));

키 (Key) 를 기준으로 Map 정렬

마찬가지로, 키를 기준으로 Map 을 정렬할 수 있습니다. 비교자 함수에서 return student1.getKey().compareTo(student2.getKey());는 정렬 방식을 결정합니다. 즉, 키를 기준으로 정렬합니다.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

Collections.sort(studentList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer> student1, Map.Entry<String, Integer> student2) {
        return student1.getKey().compareTo(student2.getKey());
    }
});

키 (Key) 를 기준으로 정렬된 Map 표시

정렬된 Map 을 콘솔에 표시합니다.

for (Map.Entry<String, Integer> student : studentList) {
    System.out.println(student.getKey() + " " + student.getValue());
}

Lambda Expression 을 사용하여 키 (Key) 기반 Map 정렬

더 짧고 효율적인 방법인 람다 표현식 (Lambda Expression) 을 사용하여 키를 기준으로 Map 을 정렬할 수도 있습니다.

List<Map.Entry<String, Integer>> studentList = new ArrayList<>(students.entrySet());

studentList.sort((student1, student2) -> student1.getKey().compareTo(student2.getKey()));

Lambda Expression 을 활용한 키 (Key) 기반 정렬된 Map 표시

정렬된 Map 을 콘솔에 표시합니다.

studentList.forEach(student -> System.out.println(student.getKey() + " " + student.getValue()));

요약

이 랩에서는 Collections.sort() 메서드와 Comparator 함수를 사용하여, 그리고 람다 표현식 (Lambda Expression) 을 사용하여 Java Map 을 값 (value) 을 기준으로 정렬하는 방법을 배웠습니다. 또한 키 (key) 를 기준으로 Map 을 정렬하는 방법도 배웠습니다. 값을 기준으로 Map 을 정렬하는 것은 순위 매기기나 우선순위 기반 작업과 같은 많은 상황에서 유용할 수 있습니다.