在java中怎样对一个Map进行排序(java 8之前的版本)

来源:互联网 发布:c 二维数组输入 编辑:程序博客网 时间:2024/05/16 17:38

 几个对一个Map的keys或者values进行排序的java例子.

注意:
如果你使用的是 Java 8, 参考这篇文章 –  Java 8 – 怎样对Map排序 

1. 按照key排序

1.1 用 java.util.TreeMap, 它将自动根据keys对Map进行排序.

SortByKeyExample1.java
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<String, String> unsortMap = new HashMap<String, String>();        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<String, String> treeMap = new TreeMap<String, String>(unsortMap);        printMap(treeMap);    }    //pretty print a map    public static <K, V> void printMap(Map<K, V> map) {        for (Map.Entry<K, V> entry : map.entrySet()) {            System.out.println("Key : " + entry.getKey()+ " Value : " + entry.getValue());        }    }}

Output

Unsort Map......Key : A Value : aKey : B Value : bKey : C Value : cKey : D Value : dKey : E Value : eKey : F Value : fKey : Y Value : yKey : Z Value : zKey : J Value : jKey : M Value : mKey : N Value : nSorted Map......By KeyKey : A Value : aKey : B Value : bKey : C Value : cKey : D Value : dKey : E Value : eKey : F Value : fKey : J Value : jKey : M Value : mKey : N Value : nKey : Y Value : yKey : Z Value : z

1.2 另一个 java.util.TreeMap 例子 ,提供一个自定义的 Comparator 对可以进行降序排序.

SortByKeyExample2.java
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<Integer, String> unsortMap = new HashMap<Integer, String>();        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<Integer, String> treeMap = new TreeMap<Integer, String>(                new Comparator<Integer>() {                    @Override                    public int compare(Integer o1, Integer o2) {                        return o2.compareTo(o1);                    }                });    /* For Java 8, try this lambdaMap<Integer, String> treeMap = new TreeMap<>(                (Comparator<Integer>) (o1, o2) -> o2.compareTo(o1)        );*/        treeMap.putAll(unsortMap);        printMap(treeMap);    }    public static <K, V> void printMap(Map<K, V> map) {        for (Map.Entry<K, V> entry : map.entrySet()) {            System.out.println("Key : " + entry.getKey()+ " Value : " + entry.getValue());        }    }}

Output

Unsort Map......Key : 1 Value : dKey : 50 Value : jKey : 2 Value : mKey : 99 Value : nKey : 20 Value : cKey : 5 Value : bKey : 6 Value : aKey : 7 Value : eKey : 8 Value : yKey : 9 Value : fKey : 10 Value : zSorted Map......By KeyKey : 99 Value : nKey : 50 Value : jKey : 20 Value : cKey : 10 Value : zKey : 9 Value : fKey : 8 Value : yKey : 7 Value : eKey : 6 Value : aKey : 5 Value : bKey : 2 Value : mKey : 1 Value : d

2. 按照value排序

将 Map 转换放入一个 List<Map>, 用一个自定义的  Comparator对 List<Map> 进行排序 并且将其放入一个新的 有序map – LinkedHashMap 中。

Map ---> List<Map> ---> Collections.sort() --> List<Map> (Sorted) ---> LinkedHashMap
SortByValueExample1.java
package com.mkyong.test;import java.util.*;public class SortByValueExample1 {    public static void main(String[] args) {        Map<String, Integer> unsortMap = new HashMap<String, Integer>();        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<String, Integer> sortedMap = sortByValue(unsortMap);        printMap(sortedMap);    }    private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) {        // 1. Convert Map to List of Map        List<Map.Entry<String, Integer>> list =                new LinkedList<Map.Entry<String, Integer>>(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<Map.Entry<String, Integer>>() {            public int compare(Map.Entry<String, Integer> o1,                               Map.Entry<String, Integer> o2) {                return (o1.getValue()).compareTo(o2.getValue());            }        });        // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap        Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();        for (Map.Entry<String, Integer> entry : list) {            sortedMap.put(entry.getKey(), entry.getValue());        }        /*        //classic iterator example        for (Iterator<Map.Entry<String, Integer>> it = list.iterator(); it.hasNext(); ) {            Map.Entry<String, Integer> entry = it.next();            sortedMap.put(entry.getKey(), entry.getValue());        }*/        return sortedMap;    }    public static <K, V> void printMap(Map<K, V> map) {        for (Map.Entry<K, V> entry : map.entrySet()) {            System.out.println("Key : " + entry.getKey()                    + " Value : " + entry.getValue());        }    }}

Output

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

2.2 升级上面的sortByValue() 方法去支持泛型.

public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> unsortMap) {    List<Map.Entry<K, V>> list =            new LinkedList<Map.Entry<K, V>>(unsortMap.entrySet());    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {        public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {            return (o1.getValue()).compareTo(o2.getValue());        }    });    Map<K, V> result = new LinkedHashMap<K, V>();    for (Map.Entry<K, V> entry : list) {        result.put(entry.getKey(), entry.getValue());    }    return result;}
原创粉丝点击