首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Collectors.collectingAndThen与Collectors.groupingBy结合使用

如何将Collectors.collectingAndThen与Collectors.groupingBy结合使用
EN

Stack Overflow用户
提问于 2022-04-09 00:17:28
回答 2查看 346关注 0票数 2

例如,给出了以下列表:

代码语言:javascript
复制
List<String> input = List.of("FOO", "FOO", "FOO", "FOO", "FOO", "BAR", "BAR", "BAZ", "BAZ", "BAZ", "DOO", "DOO"); 

我需要得到每个元素的相对频率,并打印它格式化为一个字符串。为此,我使用了两个步骤,首先创建一个频率图,然后计算相对百分比和格式:

代码语言:javascript
复制
Map<String, Long> relativeFrequency =
        input.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

Map<String, String> relativeFrequency2 = relativeFrequency.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
                entry -> String.format ( "%.02f%%", entry.getValue() * 100.  / input.size() )));

System.out.println(relativeFrequency2);

得到结果

代码语言:javascript
复制
{BAR=16.67%, DOO=16.67%, FOO=41.67%, BAZ=25.00%}

有人告诉我要重构上面的内容,并使用Collectors.collectingAndThen,一次完成,但是我似乎找不到正确的语法(编译错误Operator '*' cannot be applied to '<lambda parameter>', 'double')。有人能帮助纠正以下情况以获得与上面相同的结果吗?

代码语言:javascript
复制
Map<String, String> relativeFrequency3 = 
input.stream().collect(Collectors.collectingAndThen(Collectors.groupingBy(Function.identity(), Collectors.counting(),
                total -> String.format ( "%.02f%%", total * 100.  / input.size() ))
));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-09 03:39:55

你们关系很好。

代码语言:javascript
复制
List<String> input =
        List.of("FOO", "FOO", "FOO", "FOO", "FOO", "BAR",
                "BAR", "BAZ", "BAZ", "BAZ", "DOO", "DOO");

frequency.

  • then
  • collectingAndThen的第一个参数是counting(),通过将其转换为格式化百分比来获得处理频率的counting()

代码语言:javascript
复制
Map<String, String> map = input.stream().collect(Collectors
        .groupingBy(a -> a, Collectors.collectingAndThen(
                Collectors.counting(),
                count -> "%.2f%%".formatted((double) count
                        / input.size() * 100))));
        
map.entrySet().forEach(System.out::println);

打印每一项集的产量

代码语言:javascript
复制
BAR=16.67%
DOO=16.67%
FOO=41.67%
BAZ=25.00%
票数 5
EN

Stack Overflow用户

发布于 2022-04-09 01:17:39

代码语言:javascript
复制
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;

class Main {
    public static void main(String args[]) {
        var input = List.of("FOO", "FOO", "FOO", "FOO", "FOO", "BAR", "BAR", "BAZ", "BAZ", "BAZ", "DOO", "DOO");
        var out = input.stream()
            .collect(Collectors.groupingBy(
                w -> w,
                Collectors.collectingAndThen(
                    Collectors.summingInt(w -> 1),
                    s -> String.format("%.02f%%", s * 100. / input.size()))
            ));
        System.out.println(out);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71804304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档