首页 > 解决方案 > 为什么要输出映射键,你需要在 forEach 之前使用 map (Map.Entry::getKey) ,而 forEach 中的 getKey () 不会给出相同的结果?

问题描述

我编写了一个程序,它会从流中获取文本并对其进行排序,并在屏幕上显示另外 10 个单词,结果如下:

public class Main {
    public static void main(String[] args) throws IOException {

        Map<String, Integer> map = new HashMap<>();
        Scanner scan = new Scanner(System.in,StandardCharsets.UTF_8).useDelimiter("[^\\p{LD}]+");
        scan.forEachRemaining(word -> map.merge(word.toLowerCase(), 1, Integer::sum));

        map.entrySet().stream().limit(10).sorted((Map.Entry.<String, Integer>comparingByValue().reversed().thenComparing(Map.Entry.<String, Integer>comparingByKey()))).forEachOrdered(key->System.out.println(key.getKey()));

    }

}

但是当执行时,它给出了错误的结果,但是如果你改变它来重写.map(Map.Entry::getKey).forEach(System.out::println)

map.entrySet().stream().sorted((Map.Entry.<String, Integer>comparingByValue().reversed().thenComparing(Map.Entry.<String, Integer>comparingByKey()))).limit(10).map(Map.Entry::getKey).forEach(System.out::println);

然后它给出了想要的结果

也就是这样一段文字:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。在 faucibus 的 Sed sodales consectetur purus。Donec mi quam, tempor vel ipsum non, faucibus suscipit massa。Morbi lacinia velit blandit tincidunt efficitur。前庭 eget metus imperdiet sapien laoreet faucibus。Nunc eget vehicula mauris, ac autor lorem。Lorem ipsum dolor sit amet, consectetur adipiscing elit。Integer vel odio nec mi tempor dignissim。

adipiscing tempor blandit efficitur lacinia laoreet massa odio suscipit 前庭

给出以下(不正确的)结果,但替换给出了正确的结果

consectetur faucibus ipsum lorem adipiscing amet dolor eget elit mi

我希望我正确地提出了这个问题,我很乐意提供帮助!

标签: javajava-stream

解决方案


推荐阅读