当前位置: 首页 > 知识库问答 >
问题:

Java 8流-合并映射并计算“值”的平均值

穆宏胜
2023-03-14

假设我有一个类的List,每个类都有一个Map

public class Test {
    public Map<Long, Integer> map;
}

Map中的Long键是时间戳,Integer值是分数。

我试图创建一个Stream,它可以组合所有对象的地图,并输出带有唯一时间戳(TheLongs)和平均分数的Map

我有这个代码,但它给我所有分数的总和,而不是平均值(整数类没有平均值方法)。

Test test1 = new Test();
    test1.map = new HashMap() {{
        put(1000L, 1);
        put(2000L, 2);
        put(3000L, 3);
    }};

    Test test2 = new Test();
    test2.map = new HashMap() {{
        put(1000L, 10);
        put(2000L, 20);
        put(3000L, 30);
    }};

    List<Test> tests = new ArrayList() {{
        add(test1);
        add(test2);
    }};

    Map<Long, Integer> merged = tests.stream()
            .map(test -> test.map)
            .map(Map::entrySet)
            .flatMap(Collection::stream)
            .collect(
                    Collectors.toMap(
                            Map.Entry::getKey,
                            Map.Entry::getValue,
                            Integer::sum

                    )
            );
    System.out.println(merged);

我想这可能不是一个简单的问题,所以在一个单一的Stream中解决,所以一个带有唯一时间戳的Map和所有分数的List的输出也可以。然后我可以自己计算平均值。

Map<Long, List<Integer>> 

它它可能吗?

共有1个答案

冷涵忍
2023-03-14

代替Collectors.toMap使用Collectors.groupingBy

Map<Long, Double> merged = tests.stream()
        .map(test -> test.map)
        .map(Map::entrySet)
        .flatMap(Collection::stream)
        .collect(
                Collectors.groupingBy(
                        Map.Entry::getKey,
                        Collectors.averagingInt(Map.Entry::getValue)
                )
        );

哦,即使你可能不再需要它了,你也可以得到<代码>地图

Map<Long, List<Integer>> merged = tests.stream()
    .map(test -> test.map)
    .map(Map::entrySet)
    .flatMap(Collection::stream)
    .collect(
            Collectors.groupingBy(
                    Map.Entry::getKey,
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList())
            )
    );
 类似资料:
  • 假设我们有一个DF,其受尊重的用户ID中有重复项,但名称不同,当然也可以是重复项。 目的是分别聚合和计算用户ID及其名称的均值和均方差。一个所需的输出示例: 因此我的问题是: 有哪些选项可以根据UserID聚合Names,而不会丢失信息(Hank被强制插入Ed等,就像sumise()或mutate()一样) 按照我的想法,R必须检查哪个名称对应于用户ID,以及是否匹配;汇总并计算平均值 与此同时,

  • 我试图做以下java分配和每件事似乎工作正常,除了当我把一个数字 谢谢 赋值:创建一个询问考试结果并计算成绩平均值的程序。成绩是4到10之间的浮点数。程序要求成绩,直到键入负数。如果用户给出的分数不是4到10之间的数字,则文本“无效成绩!”将在屏幕上打印,程序要求另一个分数。最后,程序在屏幕上打印输入的成绩数及其平均值,如示例打印所示。如果没有输入成绩,通知“您没有输入任何成绩。”是屏幕上唯一打印

  • 我想合并两个地图与JAVA 8流: 我尝试使用以下实现: 但是,此实现只会产生如下结果:

  • 问题内容: 我得到了一个带有2列值的.txt文件。它们是2D坐标,因此第一列代表x值,第二列代表z值。不幸的是,有些行具有相同的x值但具有不同的z值。我想计算z值的平均值,以便将单个z与单个x关联。我所拥有的一个样本是: 如您所见,x值435.212与4个不同的z值相关联。我想拥有的是: 其中108.8985是(108.894 + 108.897 + 108.9 + 108.903)/ 4的结果。

  • 问题内容: 编辑:我已经写了平均的代码,但我不知道如何使它也使用从我的args.length而不是数组的整数 我需要编写一个Java程序,该程序可以计算:1.读入的整数数2.平均值-不必是整数! 注意!我不想从数组中计算平均值,但是要在args中计算整数。 目前我已经写了这个: 谁能指导我正确的方向?还是举个例子,以书面形式指导我塑造这段代码? 提前致谢 问题答案: 只需对您的代码进行一些小的修改

  • 所有人。我在尝试合并两个映射时遇到了这个问题。IDE显示编译错误: 不能从静态上下文引用非静态方法 问题是,我需要将它们合并成一个新的,以不同的参数作为值,在这种情况下,我需要计算第一个映射的和第二个映射的LocalDateTime之间的差值,因此结果应该是 在行中还有一个,因为IDE认为value1和value2属于对象类型,而不是临时类型。这很奇怪,因为以前我在结果映射中选择了不正确的参数类型