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

流数和常数的流平均值

昌乐
2023-03-14

这是我的代码,它根据一个人所做测试的平均分数返回一个分数。

    public Map<Person, String> defineMarks(Stream<CourseResult> results) {
    return results.collect(Collectors.toMap(CourseResult::getPerson,x->{
        double avg=x.getTaskResults().values().stream().collect(Collectors.summarizingInt(Integer::intValue)).getAverage();
        if(avg > 90) return "A";
        if(avg >= 83) return "B";
        if(avg >= 75) return "C";
        if(avg >= 68) return "D";
        if(avg >= 60) return "E";
        else return "F";
    }));
}

以下是CourseResult类供参考

public class CourseResult {
    private final Person person;
    private final Map<String, Integer> taskResults;

    public CourseResult(final Person person, final Map<String, Integer> taskResults) {
        this.person = person;
        this.taskResults = taskResults;
    }

    public Person getPerson() {
        return person;
    }

    public Map<String, Integer> getTaskResults() {
        return taskResults;
    }
}

和2种生成测试分数的方法。历史结果

private final String[] practicalHistoryTasks = {"Shieldwalling", "Phalanxing", "Wedging", "Tercioing"};

private Stream<CourseResult> historyResults(final Random random) {
    int n = random.nextInt(names.length);
    int l = random.nextInt(lastNames.length);
    AtomicInteger t = new AtomicInteger(practicalHistoryTasks.length);

    return IntStream.iterate(0, i -> i + 1)
            .limit(3)
            .mapToObj(i -> new Person(
                    names[(n + i) % names.length],
                    lastNames[(l + i) % lastNames.length],
                    18 + random.nextInt(20)))
            .map(p -> new CourseResult(p,
                    IntStream.iterate(t.getAndIncrement(), i -> t.getAndIncrement())
                            .map(i -> i % practicalHistoryTasks.length)
                            .mapToObj(i -> practicalHistoryTasks[i])
                            .limit(3)
                            .collect(toMap(
                                    task -> task,
                                    task -> random.nextInt(51) + 50))));
}

和编程结果

    private final String[] programTasks = {"Lab 1. Figures", "Lab 2. War and Peace", "Lab 3. File Tree"};

 private Stream<CourseResult> programmingResults(final Random random) {
    int n = random.nextInt(names.length);
    int l = random.nextInt(lastNames.length);

    return IntStream.iterate(0, i -> i + 1)
            .limit(3)
            .mapToObj(i -> new Person(
                    names[(n + i) % names.length],
                    lastNames[(l + i) % lastNames.length],
                    18 + random.nextInt(20)))
            .map(p -> new CourseResult(p, Arrays.stream(programTasks).collect(toMap(
                    task -> task,
                    task -> random.nextInt(51) + 50))));
}

所以每个人有3个测试分数。如果我使用编程生成分数,结果很好,因为只有3个编程测试,但是如果我使用历史生成分数,结果我也每个人得到3个测试分数,但是我应该把它当作第四个测试根本没有尝试,这意味着0分。我如何让我的定义标记方法得到收集的测试分数的平均值,而在历史结果的情况下,得到收集的测试分数的平均值和0分。

如果我的问题不清楚,请指导我如何让它变得更好: D

共有1个答案

朱翔
2023-03-14

我不太明白这个练习的意义。但是如果你只想在你的流中添加一个值,并且你不能修改测试分数的产生方法(在那里很容易将限制(3)更改为限制(4)),那么你可以使用任务名称来改变你计算平均值的方式,因为所有编程任务都以Lab...开头:

return results.collect(
        Collectors.toMap(
                CourseResult::getPerson,
                x -> {
                    boolean areProgramTasks = x.getTaskResults().keySet().stream().allMatch(key -> key.startsWith("Lab "));
                    double avg;
                    if(areProgramTasks){
                        avg = x.getTaskResults().values().stream().collect(Collectors.summarizingInt(Integer::intValue)).getAverage();
                    }
                    else {
                        avg = Stream.concat(Stream.of(0), x.getTaskResults().values().stream()).collect(Collectors.summarizingInt(Integer::intValue)).getAverage();
                    }
                    if(avg >  90) return "A";
                    if(avg >= 83) return "B";
                    if(avg >= 75) return "C";
                    if(avg >= 68) return "D";
                    if(avg >= 60) return "E";
                    else return "F";
                }
        ));
 类似资料:
  • 我需要使用流创建两个方法。返回每个任务平均分数的方法。 以及一种返回平均得分最高的任务的方法。 我只能修改这两种方法。 这是CourseResult课程 以及创建CourseResult对象的方法。 基于这些方法,我可以通过将该任务的分数之和除以3来计算每个任务的平均值,因为只有3个人可以让它除以一个等于流中CourseResult对象数量的数字,如果这些方法改变了它们的. limited(3)。

  • 我想采取以下方法: 并使用Streams api更新它。这是我到目前为止得到的: 有没有办法在不流式传输两次(第二次获得计数)的情况下做到这一点?

  • 是否可以对流进行求和、平均并将其转换为新对象。我有个目标 现在我想得到这个对象列表的平均值和总和(代码总和价格和代码平均价格) 然后我想创建一个新对象(页脚 这就是我现在所拥有的,它可以工作,但是我要通过两次流。我想要一个方法,我可以通过一次流来做到这一点。 有没有更好的方法做到这一点而不必重复这一点。谢谢

  • 我需要写一个程序来计算用户输入的整数的奇偶平均数。用户键入“完成”以完成。输出将显示奇数的平均值和偶数的平均值。 我有一个while循环程序,可以计算数字的和,我正试图增加奇数和偶数和的额外要求。这是代码: 下面是我修改的代码,对奇数和偶数进行排序,然后对每组进行平均。 预期: 实际:

  • Python是否有一个SciPy函数或NumPy函数或模块来计算给定特定窗口的一维数组的运行平均值?