这是我的代码,它根据一个人所做测试的平均分数返回一个分数。
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
我不太明白这个练习的意义。但是如果你只想在你的流中添加一个值,并且你不能修改测试分数的产生方法(在那里很容易将限制(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函数或模块来计算给定特定窗口的一维数组的运行平均值?