【发布时间】:2021-06-12 11:27:44
【问题描述】:
我正在尝试获取按部门分组的每个学生的总分数,并按他们的总分数排序。 这就是我正在尝试的方式。
学生班级属性:
private String firstName,lastName,branch,nationality,grade,shName;
private SubjectMarks subject;
private LocalDate dob;
SubjectMarks 类:
public SubjectMarks(int maths, int biology, int computers) {
this.maths = maths;
this.biology = biology;
this.computers = computers;
}
public double getAverageMarks() {
double avg = (getBiology() + getMaths() + getComputers())/3;
return avg;
}
主类:
Collections.sort(stList, new Comparator<Student>() {
@Override
public int compare(Student m1, Student m2) {
if(m1.getSubject().getAverageMarks() == m2.getSubject().getAverageMarks()){
return 0;
}
return m1.getSubject().getAverageMarks()< m2.getSubject().getAverageMarks()? 1 : -1;
}
});
Map<String, List<Student>> groupSt=stList.stream().collect(Collectors.groupingBy(Student::getBranch,
LinkedHashMap::new,Collectors.toList()));
groupSt.forEach((k, v) -> System.out.println("\nBranch Name: " + k + "\n" + v.stream()
.flatMap(stud->Stream.of(stud.getFirstName(),stud.getSubject().getAverageMarks())).collect(Collectors.toList())));
更新的代码:这就是我获取输出的方式。
Branch Name: ECE
[Bob, 96.0, TOM, 84.33333333333333]
Branch Name: CSE
[Karthik, 94.33333333333333, Angelina, 91.0, Arun, 80.66666666666667]
Branch Name: EEE
[Meghan, 85.0]
这是实际的排序顺序,但 Student 对象在一行中变平,由逗号 (,) 分隔。
在上面的输出中,由于 Bob 在所有分支中获得了最高的总分,因此 ECE 排在第一位,然后是其他分支,按学生总分排序。
预期结果是: 学生姓名列表及其总分已排序。
Branch Name: ECE
[{Bob, 96.0},{TOM, 84.33333333333333}]
Branch Name: CSE
[{Karthik, 94.33333333333333}, {Angelina, 91.0}, {Arun,
80.66666666666667}]
Branch Name: EEE
[Meghan, 85.0]
有没有办法使用流将名称和平均值映射到 groupingBy 属性上?
【问题讨论】:
-
运行此代码时的实际输出是什么?最好也发布一下。
-
那么你不想告诉我们的秘密是,你的代码会产生编译器错误?
-
看看输出,你真的不需要一个内部的
List<Map<String, Double>,整体Map<String, Map<String, Double>>对你来说应该足够了。您可以考虑根据您想要的比较器为内部映射使用排序映射。 -
@Gautham M 抱歉,我很忙,无法回答您的问题。实际上,我的尝试有编译错误。
-
@Holger 没有秘密。我是java的初学者。我希望最好是提出建议而不是泄露秘密。谢谢
标签: java java-8 java-stream