Java에서 Map 정렬하는 방법

a·2024년 9월 28일

자료구조

목록 보기
4/5

Java에서 Map 정렬하는 방법

Java에서 Map은 순서가 보장되지 않기 때문에, 키(Key) 또는 값(Value) 기준으로 정렬해야 할 경우가 있습니다. 이번 글에서는 Map 또는 을 기준으로 정렬하는 방법을 예제와 함께 정리해보겠습니다.

1. TreeMap을 사용하여 Key 기준으로 정렬

HashMap은 순서를 보장하지 않지만, TreeMap은 키(Key)를 기준으로 자동으로 정렬된 Map을 제공합니다. 따라서 키 값으로 정렬하고 싶다면 TreeMap을 사용할 수 있습니다.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 2);
map.put("cherry", 5);
map.put("date", 1);

// Key값으로 정렬 (TreeMap 사용)
Map<String, Integer> sortedByKey = new TreeMap<>(map);
System.out.println("Key값으로 정렬: " + sortedByKey);

출력 결과:

Key값으로 정렬: {apple=3, banana=2, cherry=5, date=1}

2. ListLinkedHashMap을 사용하여 Value 기준으로 정렬

값(Value) 기준으로 정렬하기 위해서는 MapEntry를 리스트로 변환한 후, 값을 기준으로 정렬한 다음 다시 LinkedHashMap에 넣어주는 방법을 사용할 수 있습니다. LinkedHashMap은 삽입 순서를 유지하므로, 정렬된 순서대로 저장됩니다.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 2);
map.put("cherry", 5);
map.put("date", 1);

// Value값으로 정렬
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue());

Map<String, Integer> sortedByValue = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : list) {
    sortedByValue.put(entry.getKey(), entry.getValue());
}
System.out.println("Value값으로 정렬: " + sortedByValue);

출력 결과:

Value값으로 정렬: {date=1, banana=2, apple=3, cherry=5}

3. Stream을 사용하여 KeyValue 기준으로 정렬

Java 8부터 제공되는 Stream API를 사용하면 훨씬 간결하게 정렬할 수 있습니다. stream() 메서드를 사용하여 Map.Entry의 스트림을 생성한 후, sorted() 메서드를 이용해 정렬을 수행하고, 결과를 다시 Map으로 변환합니다.

// Key값으로 정렬
Map<String, Integer> sortedByKey = map.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByKey())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));
System.out.println("Key값으로 정렬: " + sortedByKey);

// Value값으로 정렬
Map<String, Integer> sortedByValue = map.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByValue())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));
System.out.println("Value값으로 정렬: " + sortedByValue);

출력 결과:

Key값으로 정렬: {apple=3, banana=2, cherry=5, date=1}
Value값으로 정렬: {date=1, banana=2, apple=3, cherry=5}

Java에서 Map을 오름차순 및 내림차순으로 정렬하는 방법

앞서 설명한 예시에서는 오름차순 정렬을 다루었지만, 내림차순 정렬도 가능합니다. Comparator를 사용하여 정렬 순서를 반대로 설정하는 방식으로 구현할 수 있습니다. 이번에는 내림차순 정렬까지 추가된 내용을 살펴보겠습니다.

1. TreeMap을 사용하여 Key 기준 내림차순 정렬

TreeMap의 생성자에 Comparator를 전달하여 키(Key)의 정렬 순서를 내림차순으로 변경할 수 있습니다.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 2);
map.put("cherry", 5);
map.put("date", 1);

// Key값으로 내림차순 정렬 (TreeMap + Comparator)
Map<String, Integer> sortedByKeyDesc = new TreeMap<>(Collections.reverseOrder());
sortedByKeyDesc.putAll(map);
System.out.println("Key값으로 내림차순 정렬: " + sortedByKeyDesc);

출력 결과:

Key값으로 내림차순 정렬: {date=1, cherry=5, banana=2, apple=3}

2. Value 기준 내림차순 정렬

값(Value)을 기준으로 내림차순 정렬하기 위해서는 Comparatorreversed() 메서드를 사용하여 기존 정렬 기준을 반대로 바꿀 수 있습니다.

// Value값으로 내림차순 정렬
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));

Map<String, Integer> sortedByValueDesc = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : list) {
    sortedByValueDesc.put(entry.getKey(), entry.getValue());
}
System.out.println("Value값으로 내림차순 정렬: " + sortedByValueDesc);

출력 결과:

Value값으로 내림차순 정렬: {cherry=5, apple=3, banana=2, date=1}

3. Stream을 사용하여 KeyValue 내림차순 정렬

Stream API를 사용해 간결하게 내림차순 정렬도 가능합니다. sorted() 메서드에 Comparator.reverseOrder()를 적용하여 내림차순 정렬을 구현할 수 있습니다.

// Key값으로 내림차순 정렬
Map<String, Integer> sortedByKeyDesc = map.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));
System.out.println("Key값으로 내림차순 정렬: " + sortedByKeyDesc);

// Value값으로 내림차순 정렬
Map<String, Integer> sortedByValueDesc = map.entrySet()
    .stream()
    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (e1, e2) -> e1,
        LinkedHashMap::new
    ));
System.out.println("Value값으로 내림차순 정렬: " + sortedByValueDesc);

출력 결과:

Key값으로 내림차순 정렬: {date=1, cherry=5, banana=2, apple=3}
Value값으로 내림차순 정렬: {cherry=5, apple=3, banana=2, date=1}

마무리

Java에서 Map을 정렬하는 방법은 다양합니다. 키 기준으로 정렬할 때는 TreeMap을 사용할 수 있으며, 값 기준으로 정렬할 때는 List로 변환한 뒤 정렬하거나, Stream API를 사용하여 간결하게 처리할 수 있습니다.

0개의 댓글