我得到了一个List<String>
,其中有学生的名字和标记(双倍表示为字符串)。名称出现在偶数索引处,标记出现在奇数索引处。该列表类似于:["A", "6.3", "A", "1.4", "B", "6.3", "B", "8.2", "C", "4.2", "C", "3.3", "D", "3.2"]
。 (假设给定的列表格式正确。)
我想计算每个学生的平均值,并找出这些平均值中的最高者。我尝试使用Java Stream API做到这一点。这是我的方法:
List<String> list = Arrays.asList("A", "2.5",
"A", "6.3",
"A", "1.4", // A's avg is 3.4
"B", "6.3",
"B", "8.2", // B's avg is 7.25
"C", "4.2",
"C", "3.3", // C's avg is 3.75
"D", "3.2",
"D", "2.4", // D's avg is 2.8
"E", "7.1",
"E", "9.6" // E's avg is 8.35
);
double maxAvg = IntStream.range(0, list.size())
.filter(i -> i % 2 == 0)
.mapToObj(i -> new Person(list.get(i), Double.parseDouble(list.get(i + 1))))
.collect(Collectors.groupingBy(Person::getName))
.entrySet()
.stream()
.mapToDouble(set -> set.getValue()
.stream()
.mapToDouble(Person::getMarks)
.average()
.getAsDouble())
.max()
.getAsDouble();
System.out.println(maxAvg);
Person
类如下所示:
class Person {
String name;
double marks;
Person(String name, double marks) {
this.name = name;
this.marks = marks;
}
public double getMarks() {
return marks;
}
public String getName() {
return name;
}
}
我使用上面的代码得到了正确的结果。但是我想知道我们是否可以简化它,我想知道我是否对此过于复杂了。有更好的替代方法吗?
我们可以以某种方式摆脱Person
类吗?
答案 0 :(得分:4)
您不需要Exercise::with('topic.subject')->get();
类。您可以直接按名称分组:
Person