Рубрики
Без рубрики

Как отсортировать карту на Java

– Как сортировать карту на Java

Несколько примеров Java для сортировки карты по ее ключам или значениям.

1. Сортировать по ключу

1.1 Использует java.util. Древовидная карта , она автоматически отсортирует карту по ключам.

package com.mkyong.test;

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

public class SortByKeyExample1 {

    public static void main(String[] args) {

        Map unsortMap = new HashMap();
        unsortMap.put("Z", "z");
        unsortMap.put("B", "b");
        unsortMap.put("A", "a");
        unsortMap.put("C", "c");
        unsortMap.put("D", "d");
        unsortMap.put("E", "e");
        unsortMap.put("Y", "y");
        unsortMap.put("N", "n");
        unsortMap.put("J", "j");
        unsortMap.put("M", "m");
        unsortMap.put("F", "f");

        System.out.println("Unsort Map......");
        printMap(unsortMap);

        System.out.println("\nSorted Map......By Key");
        Map treeMap = new TreeMap(unsortMap);
        printMap(treeMap);

    }

    //pretty print a map
    public static  void printMap(Map map) {
        for (Map.Entry entry : map.entrySet()) {
            System.out.println("Key : " + entry.getKey() 
				+ " Value : " + entry.getValue());
        }
    }

}

Выход

Unsort Map......
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : Y Value : y
Key : Z Value : z
Key : J Value : j
Key : M Value : m
Key : N Value : n

Sorted Map......By Key
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : J Value : j
Key : M Value : m
Key : N Value : n
Key : Y Value : y
Key : Z Value : z

1.2 Еще один java.util. Древовидная карта пример, предоставьте пользовательский Компаратор для сортировки ключа в порядке убывания.

package com.mkyong.test;

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

public class SortByKeyExample2 {

    public static void main(String[] args) {

        Map unsortMap = new HashMap();
        unsortMap.put(10, "z");
        unsortMap.put(5, "b");
        unsortMap.put(6, "a");
        unsortMap.put(20, "c");
        unsortMap.put(1, "d");
        unsortMap.put(7, "e");
        unsortMap.put(8, "y");
        unsortMap.put(99, "n");
        unsortMap.put(50, "j");
        unsortMap.put(2, "m");
        unsortMap.put(9, "f");

        System.out.println("Unsort Map......");
        printMap(unsortMap);

        System.out.println("\nSorted Map......By Key");
        Map treeMap = new TreeMap(
                new Comparator() {

                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return o2.compareTo(o1);
                    }

                });

	    /* For Java 8, try this lambda
		Map treeMap = new TreeMap<>(
		                (Comparator) (o1, o2) -> o2.compareTo(o1)
		        );
		*/
        treeMap.putAll(unsortMap);

        printMap(treeMap);

    }

    public static  void printMap(Map map) {
        for (Map.Entry entry : map.entrySet()) {
            System.out.println("Key : " + entry.getKey() 
				+ " Value : " + entry.getValue());
        }
    }

}

Выход

Unsort Map......
Key : 1 Value : d
Key : 50 Value : j
Key : 2 Value : m
Key : 99 Value : n
Key : 20 Value : c
Key : 5 Value : b
Key : 6 Value : a
Key : 7 Value : e
Key : 8 Value : y
Key : 9 Value : f
Key : 10 Value : z

Sorted Map......By Key
Key : 99 Value : n
Key : 50 Value : j
Key : 20 Value : c
Key : 10 Value : z
Key : 9 Value : f
Key : 8 Value : y
Key : 7 Value : e
Key : 6 Value : a
Key : 5 Value : b
Key : 2 Value : m
Key : 1 Value : d

2. Сортировать по значению

Преобразует Карту в Список<Карта> , сортирует Список<Карта> с помощью пользовательского Компаратора и помещает его в новый порядок вставки карты – LinkedHashMap

Map ---> List ---> Collections.sort() --> List (Sorted) ---> LinkedHashMap
package com.mkyong.test;

import java.util.*;

public class SortByValueExample1 {

    public static void main(String[] args) {

        Map unsortMap = new HashMap();
        unsortMap.put("z", 10);
        unsortMap.put("b", 5);
        unsortMap.put("a", 6);
        unsortMap.put("c", 20);
        unsortMap.put("d", 1);
        unsortMap.put("e", 7);
        unsortMap.put("y", 8);
        unsortMap.put("n", 99);
        unsortMap.put("j", 50);
        unsortMap.put("m", 2);
        unsortMap.put("f", 9);

        System.out.println("Unsort Map......");
        printMap(unsortMap);

        System.out.println("\nSorted Map......By Value");
        Map sortedMap = sortByValue(unsortMap);
        printMap(sortedMap);

    }

    private static Map sortByValue(Map unsortMap) {

        // 1. Convert Map to List of Map
        List> list =
                new LinkedList>(unsortMap.entrySet());

        // 2. Sort list with Collections.sort(), provide a custom Comparator
        //    Try switch the o1 o2 position for a different order
        Collections.sort(list, new Comparator>() {
            public int compare(Map.Entry o1,
                               Map.Entry o2) {
                return (o1.getValue()).compareTo(o2.getValue());
            }
        });

        // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap
        Map sortedMap = new LinkedHashMap();
        for (Map.Entry entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        /*
        //classic iterator example
        for (Iterator> it = list.iterator(); it.hasNext(); ) {
            Map.Entry entry = it.next();
            sortedMap.put(entry.getKey(), entry.getValue());
        }*/


        return sortedMap;
    }

    public static  void printMap(Map map) {
        for (Map.Entry entry : map.entrySet()) {
            System.out.println("Key : " + entry.getKey()
                    + " Value : " + entry.getValue());
        }
    }

}

Выход

Unsort Map......
Key : a Value : 6
Key : b Value : 5
Key : c Value : 20
Key : d Value : 1
Key : e Value : 7
Key : f Value : 9
Key : y Value : 8
Key : z Value : 10
Key : j Value : 50
Key : m Value : 2
Key : n Value : 99

Sorted Map......By Value
Key : d Value : 1
Key : m Value : 2
Key : b Value : 5
Key : a Value : 6
Key : e Value : 7
Key : y Value : 8
Key : f Value : 9
Key : z Value : 10
Key : c Value : 20
Key : j Value : 50
Key : n Value : 99

2.2 Обновите приведенный выше метод сортировки по значению() для поддержки универсальных.

    public static > Map sortByValue(Map unsortMap) {

        List> list =
                new LinkedList>(unsortMap.entrySet());

        Collections.sort(list, new Comparator>() {
            public int compare(Map.Entry o1, Map.Entry o2) {
                return (o1.getValue()).compareTo(o2.getValue());
            }
        });

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

        return result;

    }

История обновлений

  1. 7 июля 2010 года – Первый черновик.
  2. 8 июля 2014 г. – Добавьте больше примеров и исправьте опечатки.
  3. 12 августа 2016 г. – Добавьте универсальный метод, переформатируйте код, исправьте опечатки и перепишите некоторый контент.

Рекомендации

  1. Древовидная карта JavaDoc
  2. Javadoc со связанной хэш-картой
  3. Компаратор JavaDoc
  4. Java 8 – Как сортировать карту
  5. Больше удовольствия с подстановочными знаками
  6. Коллекции.сортировка() подпись
  7. Разница между супер Т и распространяется На на Яве

Оригинал: “https://mkyong.com/java/how-to-sort-a-map-in-java/”