我正在创建一个计算班级中男女学生平均分数的应用程序
Name class marks gender
abc 1 20 M
REF 1 30 F
def 2 30 F
xyz 1 40 M
dsf 3 20 F
wer 2 10 F
我希望最终输出为
class gender average
1 M 30
1 F 30
2 F 20
即男性和女性的平均分等级
我创建了一个以值为输入的地图
键作为类和值作为完整的学生对象
哪种方法更好 为女性和男性创建两个单独的地图 计算平均值然后单独计算
只有一张地图
答案 0 :(得分:1)
您可能只使用一张地图。请注意,下面的代码远非理想,它需要一些重构。它仅用于演示目的。假设我们有2个课程Student
和Average
class Student {
private String gender;
private Integer mark;
private String name;
// getters & setters
...
}
class Average {
private String gender;
private Double average;
// getters & setters
...
}
我们有一个学生班级地图
Map<String,List<Student>> course = new HashMap<>();
现在使用Stream API我们可以做这样的事情
Map<String,List<Average>> map = course.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey, e ->
Arrays.asList(
new Average("f", e.getValue().stream().filter(student -> student.getGender().equals("f"))
.mapToInt(Student::getMark).average().getAsDouble()),
new Average("m", e.getValue().stream().filter(student -> student.getGender().equals("m"))
.mapToInt(Student::getMark).average().getAsDouble()))
));
它会为您提供一个包含班级名称的地图,以及每个性别的平均分数列表。
map.forEach((s, averages) -> {
System.out.print("class: " + s + " ");
averages.forEach(average ->
System.out.print(average.getGender() + " " + average.getAverage() + " ")
);
System.out.println();
});
// class: 1 f 17.5 m 10.0
// class: 2 f 10.0 m 13.5
正如我所说的这段代码仅用于演示目的,它需要一些改进。请谨慎使用。