Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 Map을 값(Value) 기준으로 정렬하는 방법

개요

이 글에서는 Java에서 맵(Map)을 값(Value) 기준으로 정렬하는 방법을 단계별로 살펴봅니다. Java의 HashMap은 Map 인터페이스를 해시 테이블(hash table) 기반으로 구현한 자료구조로, 키(Key)와 값(Value)이 한 쌍을 이루는 엔트리들의 컬렉션입니다.

HashMap은 본질적으로 순서를 보장하지 않기 때문에, 값 기준으로 정렬된 결과를 얻으려면 엔트리 목록을 정렬한 뒤 LinkedHashMap에 다시 담아 삽입 순서를 유지해야 합니다.

입력 예시

입력 HashMap:
Key = Java, Value = 45
Key = Scala, Value = 20
Key = Mysql, Value = 11
Key = Python, Value = 75

기대 출력

정렬 후 HashMap:
Key = Mysql, Value = 11
Key = Scala, Value = 20
Key = Java, Value = 45
Key = Python, Value = 75

위 예시에서 값이 작은 순서(오름차순)대로 엔트리가 재배치된 것을 확인할 수 있습니다.

알고리즘

  1. 시작
  2. HashMap과 관련 변수를 선언합니다.
  3. 키-값 데이터를 정의합니다.
  4. sort 메서드를 사용해 맵의 요소들을 정렬합니다.
  5. getValue()로 각 엔트리의 값을 가져오고, compareTo()로 두 값을 비교합니다.
  6. 정렬된 리스트를 순회하며 getKey(), getValue()로 엔트리를 임시 맵(temp)에 담은 뒤 이를 반환합니다.
  7. 결과를 화면에 출력합니다.
  8. 종료

예제 1: main 함수 안에서 모든 로직 처리하기

첫 번째 예제는 정렬 로직을 별도의 sort() 메서드로 분리하고, main 함수에서 전체 흐름을 실행하는 방식입니다.

import java.util.*;
import java.lang.*;
public class Demo {
   public static HashMap<String, Integer> sort(HashMap<String, Integer> input_map){
      List<Map.Entry<String, Integer> > list =
      new LinkedList<Map.Entry<String, Integer> >(input_map.entrySet());
      Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() {
         public int compare(Map.Entry<String, Integer> o1,
         Map.Entry<String, Integer> o2){
            return (o1.getValue()).compareTo(o2.getValue());
         }
      });
      HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>();
      for (Map.Entry<String, Integer> aa : list) {
         temp.put(aa.getKey(), aa.getValue());
      }
      return temp;
   }
   public static void main(String[] args){
      HashMap<String, Integer> input_map = new HashMap<String, Integer>();
      input_map.put("Java", 45);
      input_map.put("Scala", 20);
      input_map.put("Mysql", 11);
      input_map.put("Python", 75);
      System.out.println("The HashMap is defined as:");
      for (Map.Entry<String, Integer> element : input_map.entrySet()) {
         System.out.println("Key = " + element.getKey() + ", Value = " + element.getValue());
      }
      Map<String, Integer> result_map = sort(input_map);
      System.out.println("\nThe HashMap after sorting is:");
      for (Map.Entry<String, Integer> element : result_map.entrySet()) {
         System.out.println("Key = " + element.getKey() + ", Value = " + element.getValue());
      }
   }
}

실행 결과

The HashMap is defined as:
Key = Java, Value = 45
Key = Scala, Value = 20
Key = Mysql, Value = 11
Key = Python, Value = 75

The HashMap after sorting is:
Key = Mysql, Value = 11
Key = Scala, Value = 20
Key = Java, Value = 45
Key = Python, Value = 75

예제 2: 객체 지향 스타일로 처리하기

두 번째 예제는 정렬 과정을 하나의 흐름 안에서 직접 수행하며, 절차를 함수 단위로 묶어 객체 지향 프로그래밍(OOP) 스타일로 구현한 경우입니다.

import java.util.*;
import java.lang.*;
public class Demo {
   public static void main(String[] args){
      HashMap<String, Integer> input_map = new HashMap<String, Integer>();
      input_map.put("Java", 45);
      input_map.put("Scala", 20);
      input_map.put("Mysql", 11);
      input_map.put("Python", 75);
      System.out.println("The HashMap is defined as:");
      for (Map.Entry<String, Integer> element : input_map.entrySet()) {
         System.out.println("Key = " + element.getKey() + ", Value = " + element.getValue());
      }
      List<Map.Entry<String, Integer> > list =
      new LinkedList<Map.Entry<String, Integer> >(input_map.entrySet());
      Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() {
         public int compare(Map.Entry<String, Integer> o1,
         Map.Entry<String, Integer> o2){
            return (o1.getValue()).compareTo(o2.getValue());
         }
      });
      HashMap<String, Integer> result_map = new LinkedHashMap<String, Integer>();
      for (Map.Entry<String, Integer> aa : list) {
         result_map.put(aa.getKey(), aa.getValue());
      }
      System.out.println("\nThe HashMap after sorting is:");
      for (Map.Entry<String, Integer> element : result_map.entrySet()) {
         System.out.println("Key = " + element.getKey() + ", Value = " + element.getValue());
      }
   }
}

실행 결과

The HashMap is defined as:
Key = Java, Value = 45
Key = Scala, Value = 20
Key = Mysql, Value = 11
Key = Python, Value = 75

The HashMap after sorting is:
Key = Mysql, Value = 11
Key = Scala, Value = 20
Key = Java, Value = 45
Key = Python, Value = 75

핵심 포인트 정리

  • Collections.sort(): 엔트리 리스트를 Comparator 기준으로 정렬합니다.
  • Comparator: compare() 메서드에서 getValue().compareTo()를 호출해 값 기준 오름차순 비교를 수행합니다.
  • LinkedHashMap: 일반 HashMap은 순서를 유지하지 않으므로, 정렬된 순서를 그대로 보존하기 위해 LinkedHashMap을 사용합니다.
  • 내림차순 정렬: 내림차순이 필요하다면 o2.getValue().compareTo(o1.getValue())처럼 비교 순서를 바꾸거나 Comparator.reverseOrder()를 활용하면 됩니다.