在Java8中使用lambda函数按键和值比较hashmap

vdzxcuhz  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(526)

我是Java8的新手,我想写一个函数,它按值对hashmap排序,如果值是按键排序的。
要按值对hashmap排序,请执行以下操作:

Map<String, Integer> map1 = new LinkedHashMap<>();
                 map.entrySet()
                .stream()
                .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
                .forEachOrdered(x -> map1.put(x.getKey(), x.getValue()));       
    map1.forEach((k,v) ->{ System.out.println(k +" "+v);} );

我使用过python3,它使用 mapSorted = sorted(map.items() , key = lambda item : (item[1], item[0])) . Java8中有类似的东西吗?

ndasle7k

ndasle7k1#

定义Map

HashMap<String, Integer>map1 = new HashMap();
        map1.put("aa",5);
        map1.put("bbb",2);
        map1.put("ccccc",2);
        map1.put("dddddd",3);

排序,如果您想与字符串比较,您需要自己定义它

List<Entry<String, Integer>> collect = map1.entrySet().stream().sorted(new Comparator<Entry<String, Integer>>(){
            @Override
            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                int ll=0;
                if (o1.getValue()>o2.getValue()){
                    ll=-1;
                }
                else if(o1.getValue()<o2.getValue()){
                    ll=1;
                }
                else if (o1.getKey().length()>o2.getKey().length()) {
                    ll=-1;
                }
                else if (o1.getKey().length()<o2.getKey().length()) {
                    ll=1;
                };
                return ll;
            }
        }).collect(Collectors.toList());

结果如[aa=5,DDDD=3,ccccc=2,bbb=2]

7cjasjjr

7cjasjjr2#

你期待的api是 Comparator#thenComparing . 这种排序的实现之所以不简单,是因为类型推断。
类型推断需要一些帮助,例如:

Comparator.comparing(Map.Entry<String, Integer>::getValue)
                    .reversed().thenComparing(Map.Entry::getKey)

除此之外,您最好将输出收集到保留顺序的Map,否则,排序将浪费计算。因此,这样的事情应该会起作用:

LinkedHashMap<String, Integer> sortedMap = map.entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)
                    .reversed().thenComparing(Map.Entry::getKey))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (a, b) -> a, LinkedHashMap::new));

相关问题