Как сортировать Map

В данной статье мы рассмотрим способы сортировки структуры данных Map в Java по ключу (key) и по значению (value).

Сортировка по значению:


import java.util.Comparator;
import java.util.HashMap;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class SortMapByValue {
    public static void main(String[] args) {

        Map<string, integer=""> initialMap = new HashMap<>();
        initialMap.put("D", 10);
        initialMap.put("I", 5);
        initialMap.put("H", 6);
        initialMap.put("C", 20);
        initialMap.put("K", 1);
        initialMap.put("G", 7);
        initialMap.put("F", 8);
        initialMap.put("A", 99);
        initialMap.put("B", 50);
        initialMap.put("J", 2);
        initialMap.put("E", 9);

        System.out.println("initialMap: " + initialMap);

        Map<string, integer=""> sortedMap = sortMapByValue(initialMap);
        System.out.println("sortedMap: " + sortedMap);
    }

    private static <k, v="" extends="" comparable<?="" super="">> Map<k, v=""> sortMapByValue(Map<k, v=""> initialMap) {

        List<map.entry<k, v="">> list =
                new LinkedList<>(initialMap.entrySet());

        list.sort(Comparator.comparing(o -> (o.getValue())));

        Map<k, v=""> result = new LinkedHashMap<>();
        for (Map.Entry<k, v=""> entry : list) {
            result.put(entry.getKey(), entry.getValue());
        }

        return result;

    }
}

</k,></k,></map.entry<k,></k,></k,></k,></string,></string,>

Вывод в консоль:


initialMap: {A=99, B=50, C=20, D=10, E=9, F=8, G=7, H=6, I=5, J=2, K=1}
sortedMap: {K=1, J=2, I=5, H=6, G=7, F=8, E=9, D=10, C=20, B=50, A=99}

В данном примере основные шаги в методе sortMapByValue это:

  1. Преобразование Map в список Map.
  2. Сортировка полученного списка с использованием нашего компаратора (сравнение значений)
  3. Проходимся циклом по списку и кладём элементы в новую Map.

Cортировка по ключу


import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class SortMapByKey {
    public static void main(String[] args) {

        Map<Integer, String> initialMap = new HashMap<>();
        initialMap.put(100, "Hundred");
        initialMap.put(90, "Ninety");
        initialMap.put(80, "Eighty");
        initialMap.put(70, "Seventy");
        initialMap.put(60, "Sixty");
        initialMap.put(50, "Fifty");
        initialMap.put(40, "Forty");
        initialMap.put(30, "Thirty");
        initialMap.put(20, "Twenty");
        initialMap.put(10, "Ten");
        initialMap.put(2, "Two");
        initialMap.put(1, "One");

        System.out.println("initialMap: " + initialMap);
        Map<Integer, String> sortedMap = new TreeMap<>(initialMap);
        System.out.println("sortedMap" + sortedMap);
    }
}

Результат:


initialMap: {80=Eighty, 1=One, 50=Fifty, 2=Two, 100=Hundred, 20=Twenty, 70=Seventy, 40=Forty, 90=Ninety, 10=Ten, 60=Sixty, 30=Thirty}

sortedMap{1=One, 2=Two, 10=Ten, 20=Twenty, 30=Thirty, 40=Forty, 50=Fifty, 60=Sixty, 70=Seventy, 80=Eighty, 90=Ninety, 100=Hundred}

В данном случае, решение заключается в использовании устройства коллекции TreeMap, которая гарантирует, что элементы внутри будут отсортированы. Также, мы можем передать свой компаратор в эту коллекцию, для изменения логику сортировки.

На этом мы заканчиваем обзор сортировки Map в Java.