首页 > 解决方案 > 如何在Java 8中同时按自然顺序按desc中的值和键对Map进行排序

问题描述

有任何方法可以在同一操作中按键和值对 Map 进行排序。地图有价值{hover=1, solar=1, waterproof=3, storage=1, battery=2}

所以排序后的值应该是

{waterproof=3, battery=2, hover=1, solar=1, storage=1}

我正在尝试

    Map mp = map.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
            (newValue,oldValue) -> oldValue, LinkedHashMap::new))
        //.sorted(Map.Entry.comparingByKey())           
        //.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
        //(newValue,oldValue) -> oldValue, LinkedHashMap::new))
            ;

标签: javalambdacollectionsjava-8java-stream

解决方案


使用创建比较器链thenComparing

Map mp = map.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.<String, Integer>comparingByValue())
                    .thenComparing(Map.Entry.comparingByKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (newValue, oldValue) -> oldValue, LinkedHashMap::new));

请注意,在这种情况下,您需要为第一个比较器指定显式类型参数,因为编译器无法在这种复杂情况下推断类型。


推荐阅读