给定一个学生类,我需要使用Java8流api,按照平均分数的顺序,找到所有名字以“a”开头的学生。
我试过下面的代码。问题是我可以很容易地通过过滤找出名字以“a”开头的学生,但是我如何找出平均分数(因为我的分数存储在一个列表中,其中有主题和分数)。还有,我怎么点?这两个问题我完全不懂。
下面是代码
public class Marks {
private String subject;
private int score;
// constructors ....
// getter and setters..
}
…和:
public class Student {
private String name;
private int id;
private List<Marks> marks;
// constructors..
// getters and setters.
}
…和:
public class StudentMarks {
public static void main(String[] args) {
String name = null;
int id = 0;
int numberOfSubjects = 0;
String subject = null;
int score = 0;
List<Student> students = new ArrayList<Student>();
List<Marks> marks = new ArrayList<Marks>();
for(int i = 0; i < numberOfStudents; i++) {
Student student = new Student();
// code here to enter the name, id and number of subjects
for(int j = 0; j < numberOfSubjects; j++) {
Marks m = new Marks();
// code to take the subject and score of the student..
m.setSubject(subject);
m.setScore(score);
marks.add(m);
}
student.setName(name);
student.setId(id);
student.setMarks(marks);
students.add(student);
}
// This would filter out the students whose name starts with 'A'
List<Student> names = students.stream().filter(n -> n.getName().startsWith("A")).collect(Collectors.toList());
// Now second step (basically all this is to be done in one step) is to get the average marks and that too in some order (either ascending or descending. How do I do this ???
OptionalDouble averageMarks = students.stream().filter(n -> n.getName().startsWith("A")).mapToDouble(s -> s.getMarks().get(0).getScore()).average();
// I can't have get(0) above
// How do I use mapToDouble to get the average as marks are stored in a list which has subject and score. I need to get the sum and then average for all students and then order them
// How do I use mapToDouble to sum the marks for each student and then get an average and then order them (ascending / descending).
}
}
2条答案
按热度按时间a7qyws3x1#
我用getter和setter创建了类。额外的学生将显示过滤正在工作。我会这样做的。
这是流处理。
字母的第一个过滤器
A
然后,建立一个TreeMap
,键为学生的平均值,值为名称。平均值来自总和静力学方法。
印刷品
如果您希望平均值按升序排列,只需从树形图中删除比较器。
tpxzln5u2#
一种快速肮脏的方法是借助于
Comparator
. 但是,这种方法不必要地计算平均值。您可以根据名称进行筛选,然后创建一个Map,使学生成为关键和平均值
Marks
的score
是值,然后根据该值对Map进行排序,最后得到排序后的Map列表Student
.这种方法也有缺点。
或者,可以计算平均值并将其设置为示例变量(可能是在通过setter方法或构造函数设置
list时)。然后,使用它通过方法引用对平均示例变量的getter对流进行排序,最后将其收集为排序列表。 注意:有比我提供的更有效的解决方案。这只是给你一个想法。要更改排序顺序,只需调整
Comparator给予
sorted()`