gpt4 book ai didi

loops - 如何只迭代一次java流

转载 作者:行者123 更新时间:2023-12-04 08:48:27 26 4
gpt4 key购买 nike

我有资料 Map<String, List<Students>>其中键是主题名称。
我想遍历每个科目并添加与学生对应的其他科目的分数。
我试过以下

wing:

data.entrySet().stream().forEach(subject -> sumScoresOfAStudent(subject, data));

private void sumScoresOfAStudent(Entry<String, List<Student>> subject, Map<String, List<Student>> data) {
String firstSubject = subject.getKey();
List<Student> firstSubjectScores = subject.getValue();
List<Student> otherSubjectScores = data.entrySet().stream()
.filter(subjectData -> !subjectData.getKey().equalsIgnoreCase(firstSubject))
.map(subjectData -> subjectData.getValue()).flatMap(subjectData -> subjectData.stream())
.collect(Collectors.toList());
...
}
但是在这里我注意到如果我有 3 个主题作为我的 Key,它会为相同的数据循环 3 次。有没有其他更好的方法只迭代一次?
在此先感谢您的帮助。
Eg:
Student s11 = new Student("A", 20);
Student s21 = new Student("B", 10);
data.put("Maths", students);
Student s12 = new Student("A", 30);
Student s22 = new Student("B", 40);
data.put("Science", students);
Student s13 = new Student("A", 45);
Student s23 = new Student("B", 20);
data.put("History", students);

Expected Output :
Student A - 95
Student B - 70

最佳答案

对不起,我完全误解了你想要什么。这假定 Student 类具有 setter/getter getScoregetName .这只是需要 map values分别是 lists of students并将它们压平成一个大流并计算每个学生的分数总和。


Map<String, Integer> scores = data.values().stream().flatMap(List::stream)
.collect(Collectors.groupingBy(Student::getName,
Collectors.summingInt(Student::getScore)));

scores.forEach((name,score) -> System.out.printf("Student %s - %s%n",
name,score));
打印
Student A - 95
Student B - 70

关于loops - 如何只迭代一次java流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64188756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com