Java - Map을 정렬(sorting)하는 다양한 방법 및 예제

JS · 14 Apr 2020

HashMap 또는 Map을 정렬(sorting)하는 다양한 방법을 소개합니다.

  • LinkedHashMap을 이용하여 정렬
  • TreeMap을 이용하여 정렬
  • List를 이용하여 정렬
  • Stream을 이용하여 정렬

Sorting에 대해서 좀 더 알고 싶으시면 Comparator로 정렬(Sorting)하는 방법 또는 Comparable로 정렬(Sorting)하는 방법을 참고해주세요.

LinkedHashMap을 이용하여 정렬

LinkedHashMap는 Map에 입력한 순서가 보장되는 클래스입니다. HashMap을 원하는 순서대로 정렬하고 이 순서대로 다시 LinkedHashMap에 입력하면 정렬된 순서대로 출력할 수 있습니다.

Sort by key

Map.Entry를 리스트로 가져와 key 값으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다.

구현된 코드는 다음과 같습니다.

Map<String, String> map = new LinkedHashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

Map<String, String> result = sortMapByKey(map);
for (Map.Entry<String, String> entry : result.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", "
            + "Value: " + entry.getValue());
}


public static LinkedHashMap<String, String> sortMapByKey(Map<String, String> map) {
    List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
    Collections.sort(entries, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));

    LinkedHashMap<String, String> result = new LinkedHashMap<>();
    for (Map.Entry<String, String> entry : entries) {
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
}

결과를 보면 key를 기준으로 오름차순으로 정렬되었습니다.(알파벳 순서)

Key: Australia, Value: Canberra
Key: England, Value: London
Key: India, Value: New Delhi
Key: Nepal, Value: Kathmandu
Key: United States, Value: Washington

Sort by value

Map.Entry를 리스트로 가져와 value를 기준으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다.

구현된 코드는 다음과 같습니다.

Map<String, String> map = new LinkedHashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

Map<String, String> result = sortMapByValue(map);
for (Map.Entry<String, String> entry : result.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", "
            + "Value: " + entry.getValue());
}


public static LinkedHashMap<String, String> sortMapByValue(Map<String, String> map) {
    List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
    Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));

    LinkedHashMap<String, String> result = new LinkedHashMap<>();
    for (Map.Entry<String, String> entry : entries) {
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
}

결과를 보면 value를 기준으로 오름차순으로 정렬되었습니다.(알파벳 순서)

Key: Australia, Value: Canberra
Key: Nepal, Value: Kathmandu
Key: England, Value: London
Key: India, Value: New Delhi
Key: United States, Value: Washington

TreeMap을 이용하여 정렬

TreeMap은 아이템을 추가할 때 설정한 Comparator로 정렬되어 저장되도록 구현된 클래스입니다. 따라서 값을 추가한 이후에 다시 정렬할 필요가 없습니다.

아래 코드처럼 TreeMap의 인자로 comparator를 전달하여 객체를 생성하였습니다.

System.out.println("3");
Comparator<String> comparator = (s1, s2)->s2.compareTo(s1);
Map<String, String> map = new TreeMap<>(comparator);
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", "
            + "Value: " + entry.getValue());
}

출력해보면, key를 기준으로 알파벳 역순으로 정렬되었습니다. (내림차순으로 Comparator를 생성하였기 때문에)

Key: United States, Value: Washington
Key: Nepal, Value: Kathmandu
Key: India, Value: New Delhi
Key: England, Value: London
Key: Australia, Value: Canberra

TreeMap은 value를 정렬하지 않기 때문에 key를 정렬하는 경우만 사용하시면 됩니다.

List를 이용하여 정렬

keySet 또는 values를 List로 가져온 뒤에, 정렬하는 방법이 있습니다. 둘 중에 한 종류만 정렬이 필요한 경우, 이 방법을 사용하시면 됩니다.

Sort by key

다음 코드는 key가 들어있는 List를 오름차순으로 정렬합니다.

Map<String, String> map = new HashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

List<String> keyList = new ArrayList<>(map.keySet());
keyList.sort((s1, s2)->s1.compareTo(s2));
for (String key : keyList) {
    System.out.println("Key: " + key);
}

결과

Key: Australia
Key: England
Key: India
Key: Nepal
Key: United States

위의 코드에서 Comparator (s1, s2)->s1.compareTo(s2)String::compareTo로 대체할 수 있습니다.

keyList.sort(String::compareTo);

Sort by value

다음 코드는 value가 들어있는 List를 오름차순으로 정렬합니다.

Map<String, String> map = new HashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

List<String> valueList = new ArrayList<>(map.values());
valueList.sort(String::compareTo);
for (String value : valueList) {
    System.out.println("Value: " + value);
}

결과

Value: Canberra
Value: Kathmandu
Value: London
Value: New Delhi
Value: Washington

Stream을 이용하여 정렬

Stream을 이용하여 정렬할 수도 있습니다.

다음 코드는 Stream을 이용하여 value 또는 key를 기준으로 정렬하는 코드입니다.

Map<String, String> map = new HashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");

// sort by key
List<Map.Entry<String, String>> entries =
        map.entrySet().stream()
                    .sorted(Map.Entry.comparingByKey())
                    .collect(Collectors.toList());
for (Map.Entry<String, String> entry : entries) {
    System.out.println("Key: " + entry.getKey() + ", "
            + "Value: " + entry.getValue());
}

// sort by value
System.out.println();
entries = map.entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .collect(Collectors.toList());
for (Map.Entry<String, String> entry : entries) {
    System.out.println("Key: " + entry.getKey() + ", "
            + "Value: " + entry.getValue());
}

결과

Key: Australia, Value: Canberra
Key: England, Value: London
Key: India, Value: New Delhi
Key: Nepal, Value: Kathmandu
Key: United States, Value: Washington

Key: Australia, Value: Canberra
Key: Nepal, Value: Kathmandu
Key: England, Value: London
Key: India, Value: New Delhi
Key: United States, Value: Washington

Stream에서 sorted()로 정렬된 아이템을 직접 출력해도 되지만 collect()로 List를 리턴하도록 했습니다.

참고