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

从流Api计算映射中的值之和

颜森
2023-03-14

我是个十足的新手,所以我请你不要说太多脏话。)

有一个集合(ArrayList)保存学生类的对象(

 sumOnSubjectInGroup = studentsInGroup.stream()
        .filter(e -> e.getRating().entrySet().iterator().next().getKey().equals(subject))
        .mapToInt(e -> e.getRating().entrySet().iterator().next().getValue())
        .reduce(0, (x, y) -> x + y);
 countMarkInGroup = (int) studentsInGroup.stream()
        .filter(e -> e.getRating().entrySet().iterator().next().getKey().equals(subject))
        .count();
 return (double) sumOnSubjectInGroup / countMarkInGroup;

其中SumonSubjectionGroup是所有学生科目分数的总和。CountMarkingGroup—此类标记的数量。studentsInGroup是包含所有学生对象的集合。getRating()-返回一个HashMap

共有2个答案

程成天
2023-03-14

您可以使用收集器。Averaging计算平均值,无需按科目单独计算总和和计数。

import java.util.*;
import java.util.stream.*;

class Student {
    String name;
    Map<String, Integer> rating;
    
    public Student(String name, Map<String, Integer> grades) {
        this.name = name;
        this.rating = grades;
    }
    
    public String getName() { return name; }
    public Map<String, Integer> getRating() { return rating; }
}

public class Main {
    public static void main(String args[]) {
        List<Student> students = Arrays.asList(
            new Student("John", Map.of("Math", 90, "Physics", 94, "Chemistry", 93, "English", 92)),
            new Student("Jack", Map.of("Math", 73, "Physics", 76, "English", 89)),
            new Student("Jane", Map.of("Math", 87, "Chemistry", 91, "French", 94)),
            new Student("Joel", Map.of("Math", 81, "Physics", 79, "French", 88))
        );
        students
            .stream()
            .flatMap(s -> s.getRating().entrySet().stream())
            .collect(Collectors.groupingBy(
                Map.Entry::getKey, Collectors.averagingInt(Map.Entry::getValue)))
            .entrySet()
            .forEach(System.out::println);
    }
}

输出:

English=90.5
Chemistry=92.0
French=91.0
Math=82.75
Physics=83.0
阎庆
2023-03-14

您可以使用。平均()来计算平均值,并使用包含密钥来检查地图中是否存在以筛选并获得分数。

Double average = studentsInGroup.stream()
            .filter(e -> e.getRating().containsKey(subject))
            .mapToInt(e -> e.getRating().get(subject))
            .average()
            .orElse(0.0);
 类似资料:
  • 假设我有一个类的,每个类都有一个。 中的键是时间戳,值是分数。 我试图创建一个,它可以组合所有对象的地图,并输出带有唯一时间戳(Thes)和平均分数的。 我有这个代码,但它给我所有分数的总和,而不是平均值(类没有平均值方法)。 我想这可能不是一个简单的问题,所以在一个单一的中解决,所以一个带有唯一时间戳的和所有分数的的输出也可以。然后我可以自己计算平均值。 它它可能吗?

  • 我有一张地图 我想从键列表中获取值,如拥有键列表,即键名称列表。 我知道一个方法 但是,我想将此列表本身传递到流API中,而不是循环,这将过滤匹配的值和返回列表。这是可能的! !提前致谢。

  • 我不想使用foreach和loop。我想使用Java8中的流在列表中的映射中查找值 问题是,在过滤器我不能搜索键/值对。 我想得到布尔=true的所有元素 我做错了什么吗?

  • 我想要一个流的等价物: 这段代码实际上并不编译,因为0不能分配给类型T,但您明白了。

  • 下面是Main中的随机客户端列表 第二类:产品(字符串名称、枚举类别、BigDecimal价格) 目标->预期结果:在类Main中,创建类Shopping的实例,其中属性是具有 的映射,并用随机数据//integer-购买了多少产品 null null

  • 假设你有一张这样的物体地图(尽管想象它更大): rtype=133,有两个! 我想对Streams做的是这样的: 我在理解Collectors&groupBy的工作原理时遇到了一些麻烦,但我想这可能会用于本例。 在Java streams API中进行编码的正确方法是什么? 我很难找到类似的地图例子(人们在他们的例子中更多地使用列表)