I can't understand why my code doesn't work. Tell me, if it's not difficult, I really ask. error in the stream, but I can't figure out why I can't fill Map from List I want to know what is the student's overall GPA. the result should be in the form: key - group value - student name - score, student name - score
class Student4 {
String name;
Subject4[] subjects;
public Student4(String name, Subject4[] subjects) {
this.name = name;
this.subjects = subjects;
}
public static void main(String[] args) {
Student4 s1 = new Student4("Name1", new Subject4[]{
new Subject4("A", new Integer[]{4, 4, 4, 4, 5}), //21 -> 4.2
new Subject4("B", new Integer[]{5, 5, 5, 5, 5}), //25 -> 5.0
new Subject4("C", new Integer[]{4, 4, 4, 4, 5}) //21 -> 4.2
});
Student4 s2 = new Student4("Name2", new Subject4[]{
new Subject4("A", new Integer[]{3, 3, 3, 4, 5}), //18 -> 3.6
new Subject4("B", new Integer[]{5, 3, 3, 5, 5}), //21 -> 4.2
new Subject4("C", new Integer[]{4, 3, 3, 4, 3}) //17 -> 3.4
});
Student4 s3 = new Student4("Name3", new Subject4[]{
new Subject4("A", new Integer[]{5, 5, 5, 4, 5}), //24 -> 4.8
new Subject4("B", new Integer[]{5, 5, 5, 4, 5}), //24 -> 4.8
new Subject4("C", new Integer[]{5, 5, 5, 4, 5}) //24 -> 4.8
});
Student4 s4 = new Student4("Name4", new Subject4[]{
new Subject4("A", new Integer[]{5, 5, 5, 4, 5}), //24 -> 4.8
new Subject4("B", new Integer[]{5, 5, 5, 4, 5}), //24 -> 4.8
new Subject4("C", new Integer[]{5, 5, 5, 4, 5}) //24 -> 4.8
});
Map<String, List<Student4>> group = new HashMap<>();
group.put("group1", List.of(s1, s2));
group.put("group2", List.of(s3, s4));
Map<String, Map<String, Double>> averageByStudent = group.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getKey(),
entry -> entry.getValue().stream()
.collect(Collectors.toMap(entry.getValue().stream()
.map(z -> z.name),
entry.getValue().stream()
.flatMap(v -> Arrays.stream(v.subjects))
.flatMap(w -> Arrays.stream(w.mark))
.mapToDouble(Integer::doubleValue)
.average().getAsDouble()
))));
}
}
class Subject4 {
String name;
Integer[] mark;
public Subject4(String name, Integer[] mark) {
this.name = name;
this.mark = mark;
}
}