【问题标题】:Word count in descending order using java lambdas使用java lambdas按降序排列字数
【发布时间】:2019-01-15 04:24:30
【问题描述】:

我有一个字符串,我想按降序对其进行字数统计。我的代码如下:

String[] line = "some text some spaces".split(" ");
Map<String, Long> map1 = Arrays.stream(line).stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> map2 = map1.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), (v1, v2) -> v2, LinkedHashMap::new));

上面给了我一个单词出现次数的降序排列。是否可以只执行一次此操作,我的意思是将第 2 行和第 3 行合并为一个。这将要求我只创建一个流。

非常感谢您。

【问题讨论】:

  • 我认为没有两个流就不可能做到这一点。

标签: java java-8 word-count


【解决方案1】:

我认为这是不可能的。由于 Collect 是终端操作,调用终端操作后不能重用流。

以下是来自以下文章的一些信息:

流操作要么是中间的,要么是终端的。中间操作返回一个流,因此我们可以在不使用分号的情况下链接多个中间操作。终端操作要么无效,要么返回非流结果。

Java 8 流不能被重用。只要您调用任何终端操作,流就会关闭。

您可以阅读此article 了解更多详情。

【讨论】:

  • 虽然我接受了 Prasad 的回答,这与我所做的基本上没有什么不同,但它仍然不是一个完美的解决方案!
  • 我同意不要过早地进行“收集”操作,但仍然只想进行一个流操作。我希望有人能回答这个问题。
【解决方案2】:

这是一种方式(它确实创建了两个流并合并了两行代码):

Map<String, Long> map = Arrays.stream("some text some spaces".split(" "))
                              .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                              .entrySet()
                              .stream()
                              .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
                              .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(),
                                        (v1, v2) -> v2, LinkedHashMap::new));

System.out.println(map); // This prints: {some=2, spaces=1, text=1}

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多