首页 > 解决方案 > Java 数组和引用

问题描述

作为我学校课程的一部分,我们正在开发一些 CodeHS Java。我遇到了一个问题:

以我们之前的学生和课堂示例为例,您应该填写方法 getMostImprovedStudent 以及方法 getExamRange。进步最大的学生是考试成绩范围最大的学生。

要计算考试分数范围,您必须从最高考试分数中减去最低考试分数。

例如,如果考试成绩为 90、75 和 84,则范围为 90 - 75 = 15。

这是我添加方法的 Student 类getExamRange()

import java.util.*;

public class Student
{
    private static final int NUM_EXAMS = 4;
    
    private String firstName;
    private String lastName;
    private int gradeLevel;
    private double gpa;
    
    private int[] exams;
    private int numExamsTaken;
    public static int[] examRange = new int[Classroom.numStudentsAdded];
    private int i = 0;

    /**
     * This is a constructor.  A constructor is a method
     * that creates an object -- it creates an instance
     * of the class. What that means is it takes the input
     * parameters and sets the instance variables (or fields)
     * to the proper values.
     * 
     * Check out StudentTester.java for an example of how to use
     * this constructor. 
     */
    public Student(String fName, String lName, int grade)
    {
        firstName = fName;
        lastName = lName;
        gradeLevel = grade;
        exams = new int[NUM_EXAMS];
        numExamsTaken = 0;
    }
    
    public int getExamRange()
    {
        Arrays.sort(exams);
        examRange[i] = exams[exams.length-1] - exams[0];
        i++;
        return exams[exams.length-1] - exams[0];
    }
    
    public String getName()
    {
        return firstName + " " + lastName;
    }
    
    public void addExamScore(int score)
    {
        exams[numExamsTaken] = score;
        numExamsTaken++;
    }
    
    // This is a setter method to set the GPA for the Student.
    public void setGPA(double theGPA)
    {
        gpa = theGPA;
    }
    
    /**
     * This is a toString for the Student class. It returns a String
     * representation of the object, which includes the fields
     * in that object.
     */
    public String toString()
    {
        return firstName + " " + lastName + " is in grade: " + gradeLevel;
    }
}

这是我在其中添加方法的 Classroom 类getMostImprovedStudent()

import java.util.*;

public class Classroom
{
    Student[] students;
    static int numStudentsAdded;
    
    public Classroom(int numStudents)
    {
        students = new Student[numStudents];
        numStudentsAdded = 0;
    }
    
    public Student getMostImprovedStudent()
    {
        Arrays.sort(Student.examRange);
        //return Student.examRange[0];
    }
    
    public void addStudent(Student s)
    {
        students[numStudentsAdded] = s;
        numStudentsAdded++;
    }
    
    public void printStudents()
    {
        for(int i = 0; i < numStudentsAdded; i++)
        {
            System.out.println(students[i]);
        }
    }
}

我可以通过对考试数组进行排序然后从最大数组中减去最小的来获得考试范围,但是一旦我这样做了,我如何找到考试范围最大的学生并将其返回?

标签: javaarrays

解决方案


你会这样做的方式是循环students,并有一个变量来保持分数的最大差异,以及进步最大的学生:

public Student getMostImprovedStudent()
{
    Student mostImproved = students[0];
    int biggest = student[i].getExamRange();
    for(int i = 1; i < students.length; i++) {
        if(students[i].getExamRange() > biggest) {
            mostImproved = students[i];
            biggest = students[i].getExamRange();
        }
    }
    return mostImproved;
}

但是 Java 8+ 我们可以这样做:

public Student getMostImprovedStudent()
{
    return Arrays.stream(students)
                 .max(Comparator.comparing(Student::getExamRange))
                 .get();                     
}

假设它students不为空


推荐阅读