我正在学习Java,并且被要求制作可用于根据输入的学生姓名和标记收集统计数据的方法。我已经弄清楚如何计算最高分,但我需要做的是返回得分最高的学生的名字,我该怎么做?我以为我可以尝试在最高int之前返回字符串,但我不确定如何做到这一点。
编辑:为了说清楚,目前,在输入数据后输入END时,返回顶部标记 - 我需要返回最佳学生的标记。
import java.util.*;
public class Course {
private ArrayList<Student> people = new ArrayList<Student>();
private int passing = 0;
private int failing = 0;
private int top = Integer.MIN_VALUE;
private int sum = 0;
public void add( Student student ) {
people.add( student );
if(student.getMark() >= 40){
passing++;
}
else {
failing++;
}
sum += student.getMark();
if(student.getMark() > top) {
top = student.getMark();
}
}
public int pass() {
return passing;
}
public int fail() {
return failing;
}
public int top() {
return top;
}
public double average() {
return sum / people.size();
}
}
感谢您的帮助。
更新:BinaryJudy,我做了你说的但是我得到了一个'NoSuchMethod'错误的顶名,这就是我改变我的代码:
import java.util.*;
public class Course {
private ArrayList<Student> people = new ArrayList<Student>();
private int passing = 0;
private int failing = 0;
private int top = Integer.MIN_VALUE;
private int sum = 0;
private String topName;
public void add( Student student ) {
people.add( student );
if(student.getMark() >= 40){
passing++;
}
else {
failing++;
}
sum += student.getMark();
if(student.getMark() > top) {
top = student.getMark();
}
if(student.getMark() > top) {
top = student.getMark();
topName = student.getName();
}
}
public int pass() {
return passing;
}
public int fail() {
return failing;
}
public String top() {
return topName;
}
public double average() {
return sum / people.size();
}
}
知道为什么吗? :)
答案 0 :(得分:1)
您已经找到了最高分的学生。找到顶部标记时,使用学生的名称更新顶级名称。找到顶部标记也会找到名称。
String topName;
if(student.getMark() > top) {
top = student.getMark();
topName = student.getName();
}
答案 1 :(得分:0)
请注意,您要存储一群我认为每个都有课程标记的学生。你需要做的就是绕过那个Arraylist,找出谁有最高分,并让那个学生回归。
这样的事可能适合你:
public String topStu(ArrayList<Student> list) { // take in any list of students
int topStudentScore = 0; // default value
Student topStudent = null;
for (student x : list) { // cycle through all students in the list
if (x.getMark() > topStudentScore) { // if the score is higher than the current listed score
topStudentScore = x.getMark(); // update the top score
topStudent = x; // update top student
}
}
return topStudent.getName(); // return his name
}
您可以轻松地将其编写为特定课程的函数 - 您可以删除该参数,并根据需要直接访问私有ArrayList。
或者,您可以将上述函数编写为静态函数,从任何课程中获取任何学生列表。
答案 2 :(得分:0)
如果学生在people
列表中是唯一的且插入顺序不重要,那么您可以更改
ArrayList<Student> people = ...;
通过
// Java7 and before
SortedSet<Student> people = new TreeSet<>(new Comparator<Student>() {
public int compare(Student s1, Student s2) {
return s2.getMark()-s1.getMark(); // sorted by decreasing mark
}
});
// Java8
SortedSet<Student> people
= new TreeSet<>(Comparator.comparingInt(Student::getMark).reversed());
然后找到最优秀的学生就可以从people
集中获得第一名:
Student top = people.first();
作为奖励,您可以轻松计算所有学生的排名。添加新学生将使他们在正确的排名。
注意:请注意,在插入后修改学生标记不会自动更改其排名,并应通过以下序列进行处理:
Student s = ...;
people.remove(s);
s.setMark(42);
people.add(s);
答案 3 :(得分:0)
public class Classroom
{
Student[] students;
int numStudentsAdded;
public Classroom(int numStudents)
{
students = new Student[numStudents];
numStudentsAdded = 0;
}
public Student getTopStudent()
{
int y = 0;
//have to use numStudentsAdded
for ( int i = 0 ; i < numStudentsAdded ; i++)
{
if (students[y].getAverageScore() < students[i].getAverageScore())
{
y = i;
}
}
return students[y] ;
}
public void addStudent(Student s)
{
students[numStudentsAdded] = s;
numStudentsAdded++;
}
public void printStudents()
{
for(int i = 0; i < numStudentsAdded; i++)
{
System.out.println(students[i]);
}
}
}