java 使用流API忽略0分任务

y3bcpkx1  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(95)

我有2种方法,我需要计算平均值,包括学生没有尝试解决的任务(0分)。一切正常,直到0出现。我坚持了下来。我的问题是什么?

  1. totalScores -返回人员到其总得分的Map(作为平均值);
  2. averageTotalScore -返回所有人的平均成绩(一定要考虑课程的所有任务,而不仅仅是某个学生完成的任务)。
    我的意思是,如果一个学生有一些数量(在我的情况下是4)的实验室工作,其中一些学生通过了(在我的情况下是3)的一些点,和一些(1)没有(他们应该成为0分),然后totalScore应该计算平均值,包括任务,学生没有试图解决(0分)。但没有0分也算。averageTotalScore应该计算每个实验的平均值,包括所有学生(在我的情况下是3)和那些没有尝试解决的人(0分)。
public Map<Person, Double> totalScores(Stream<CourseResult> results) {
    return results.collect(Collectors.toMap(CourseResult::getPerson, result -> result
            .getTaskResults()
            .values()
            .stream().mapToInt(s -> s)
            .average()
            .orElse(0.0)));
}

public double averageTotalScore(Stream<CourseResult> results) {
    List<Double> scores = results.flatMap(result -> result
        .getTaskResults()
        .values()
        .stream()
        .mapToDouble(Double::valueOf).boxed())
        .collect(Collectors.toList());
    return scores.stream().mapToDouble(Double::doubleValue).average().orElse(0);
}
myss37ts

myss37ts1#

我相信添加一个0值检查的过滤器应该可以解决这个问题,类似于下面的内容:

public Map<Person, Double> totalScores(Stream<CourseResult> results) {
    return results.collect(Collectors.toMap(CourseResult::getPerson, result -> result
            .getTaskResults()
            .values()
            .stream().mapToInt(s -> s).filter(value -> value != 0)
            .average()
            .orElse(0.0)));
}

相关问题