Map集合排序

时间:2022-07-25
本文章向大家介绍Map集合排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class MapOrder {

    public static void main(String[] args) {
        HashMap<String,Integer> hashMap = new HashMap<String,Integer>();
        hashMap.put("d",11);
        hashMap.put("k",5);
        hashMap.put("l",16);
        hashMap.put("p",7);

        /*Map<String, Integer> result = sortByValue(hashMap,false);

        List<String> list = result.entrySet().stream().map(entry -> entry.getKey())
                .collect(Collectors.toList());

        list.stream().forEach(string ->{
            System.out.println(string);
        });*/

        //sortByValue(hashMap);

        sortTreeMap();

    }

    /**
     * ********************************************************************************************************
     * java8新特性:对map集合排序,根据key或者value操作排序(升序、降序)
     * ********************************************************************************************************
     */

    /**
     * 根据map的key排序
     *
     * @param map 待排序的map
     * @param isDesc 是否降序,true:降序,false:升序
     * @return 排序好的map
     * @author zero 2019/04/08
     */
    public static <String extends Comparable<? super String>,Integer> Map<String,Integer> sortByKey(Map<String,Integer> map, boolean isDesc) {
        Map<String,Integer> result = Maps.newLinkedHashMap();
        if (isDesc) {
            map.entrySet().stream().sorted(Map.Entry.<String,Integer>comparingByKey().reversed())
                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
        } else {
            map.entrySet().stream().sorted(Map.Entry.<String,Integer>comparingByKey())
                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
        }
        return result;
    }

    /**
     * 根据map的value排序
     *
     * @param map 待排序的map
     * @param isDesc 是否降序,true:降序,false:升序
     * @return 排序好的map
     * @author zero 2019/04/08
     */
    public static <String, Integer extends Comparable<? super Integer>> Map<String, Integer> sortByValue(Map<String, Integer> map, boolean isDesc) {
        Map<String, Integer> result = Maps.newLinkedHashMap();
        if (isDesc) {
            map.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
        } else {
            map.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue())
                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
        }
        return result;
    }

    /**
     * ********************************************************************************************************
     * 传统方法:对map集合排序,根据key或者value操作排序(升序、降序)
     * ********************************************************************************************************
     */

    //HashMap
    public static void sortByValue(Map<String,Integer> map){
        List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });
        for(Map.Entry<String,Integer> mapping:list){
            System.out.println(mapping.getKey()+":"+mapping.getValue());
        }
    }



    /**
     *TreeMap:能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,
     *得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
     */
    public static void sortTreeMap(){
        Map<String,Integer> treeMap = new TreeMap<>(
                new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                }
        );
        treeMap.put("r",11);
        treeMap.put("b",5);
        treeMap.put("a",16);
        treeMap.put("p",7);

        //不用迭代器遍历
        System.out.println("不用迭代器遍历");
        treeMap.entrySet().stream().forEach(entry ->{
            System.out.println(entry.getKey() + "---->" + entry.getValue());
        });
        //用迭代器遍历
        System.out.println("用迭代器遍历");
        Iterator<Map.Entry<String,Integer>> iterator = treeMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String,Integer> entry = iterator.next();
            System.out.println(entry.getKey() + "---->" + entry.getValue());
        }

    }
}