我正在尝试按照部门对每个学生的总分进行分组,并按照他们的总分排序。
学生类属性:
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]
这是实际的排序顺序,但学生对象被压扁成一行,用逗号(,)分隔。
在上面的输出中,由于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]
有没有一种方法可以使用流(stream)将名称和平均值都映射到一个属性上的
groupingBy
函数中?
List<Map<String, Double>
,总体上Map<String, Map<String, Double>>
对你来说应该足够了。你可以考虑使用一个基于你所需比较器的排序映射来处理内部映射。 - Naman