Java 如何使用HashMap计算学生的平均成绩?

Java 如何使用HashMap计算学生的平均成绩?,java,Java,在学生课程中,我需要添加一个方法,将新课程放入学生的课程集合,以及一个计算并返回学生平均成绩的方法。当我试图计算学生的平均成绩时,结果总是得到NaN。非常感谢您的帮助。谢谢 下面是我的学生课程的源代码 import java.util.HashMap; import java.util.Set; public class Student extends Member { // instance variables of class Student private HashMa

在学生课程中,我需要添加一个方法,将新课程放入学生的课程集合,以及一个计算并返回学生平均成绩的方法。当我试图计算学生的平均成绩时,结果总是得到NaN。非常感谢您的帮助。谢谢

下面是我的学生课程的源代码

import java.util.HashMap;
import java.util.Set;


public class Student extends Member
{
    // instance variables of class Student
    private HashMap<String, Double> courses;

    public Student()
    {
        super();
        courses = new HashMap<String, Double>();
    }

    /**
     * Constructor
     * @param firstName
     * @param lastName
     * @param emailAddress
     * @param bcitId
     */
    public Student(String firstName, String lastName, String emailAddress, String bcitId)
    {
        super(firstName, lastName, emailAddress, bcitId);
        courses = new HashMap<String, Double>();
    }

    public void addCourse(String course, Double grade)
    {
        if(!courses.isEmpty()) {
            courses.put(course, grade);
        }
    }

    public Double getAverageGrade()
    {
        Double averageGrade = 0.0;
        int counter = 0;
        if(!courses.isEmpty()){
            Set<String> course = courses.keySet();
            for(String grade : course){
                averageGrade += courses.get(grade);
                counter++;
            }
        }

        return (averageGrade /= counter);
    }
}
NaN表示除其他外被零除。计数器从未增加,因为未添加课程;请参见luksch的答案了解原因。此外,由于您将不再参考averageGrade,因此您可以简单地使用

return averageGrade / counter;
更有效一点。

你的方法

public void addCourse(String course, Double grade)
{
    if(!courses.isEmpty()) {
        courses.put(course, grade);
    }
}
我觉得很有趣。如果地图中至少有一个球场,您是否只打算添加球场?这样,第一个课程将如何进入地图

我认为您试图检查地图是否存在,但这样做的方式不同,即:

if (courses == null){
  ...
}

关于除法问题,请看Saposhiente的另一个答案。我只想重复一下…

它返回NaN的唯一方法是当cours.isEmpty返回true,因为couter不会递增,您将除以0

此外,您还可以通过使用getValues来改进您的周期

public Double getAverageGrade()
    {
        Double averageGrade = 0.0;
        int counter = 0;
        if(!courses.isEmpty()){

            for(Double grade : courses.getValues()){
                averageGrade += grade
                counter++;
            }
        } else {
           return -1; // or some value that says that are no grades yet
        }

        return (averageGrade /= counter);
    }

下面是一个简单的HashMap技术,请参考下面的代码进行计算 平均水平,并从中找到最好的学生,很好地理解它,我可能会帮助你 谢谢

import java.util.*;

public class QueQue {

public static float getAverage(HashMap<String, ArrayList<Integer>> hm, String name) {
    ArrayList<Integer> scores;
    scores = hm.get(name);
    if (scores == null) {
        System.out.println("NOT found");
    }

    int sum = 0;
    for (int x : scores) {
        sum += x;
    }
    return (float) sum / scores.size();
}

 // The best students from these Key-Value Pair

public static String getBestStudent(HashMap<String, ArrayList<Integer>> hm) {
    double max = 0;
    String beststudent = null;
    for (Map.Entry<String, ArrayList<Integer>> x : hm.entrySet()) {
        String name = x.getKey();
        double average = getAverage(hm, name);
        if (average > max) {
            max = average;
            beststudent = name;
        }
    }
    return beststudent;
}

public static void main(String[] args) {
    HashMap<String, ArrayList<Integer>> hm = new HashMap<>();
    hm.put("Peter", new ArrayList<>());
    hm.get("Peter").add(10);
    hm.get("Peter").add(10);
    hm.get("Peter").add(10);

    hm.put("Nancy", new ArrayList<>());
    hm.get("Nancy").add(7);
    hm.get("Nancy").add(8);
    hm.get("Nancy").add(8);

    hm.put("Lily", new ArrayList<>());
    hm.get("Lily").add(9);
    hm.get("Lily").add(9);
    hm.get("Lily").add(8);

    System.out.println("Find the average of the Peter");
    float num = getAverage(hm, "Peter");
    System.out.println(num);
    String name = getBestStudent(hm);
    System.out.println(name);
}

 }

这不仅仅是忘记增加计数器;代码显示op确实增加了它。问题是在return语句.counter递增之前,没有检查counter==0的时间。相反,课程是空的,所以OP得到了0.0/0.0。哎呀,疏忽。编辑。我们现在有两个答案,每个答案都指向另一个;也许我们应该把它们整合到社区维基中,哈。很好的一个。我会给你+1,但当我第一次看到你的答案时我已经给了:因为他从未在地图上添加任何课程,这也会导致NaN结果。因此我建议调查Saposhiente的答案!由于这似乎是一个家庭作业,我认为这并不是要求用户3078337阅读太多。
import java.util.*;

public class QueQue {

public static float getAverage(HashMap<String, ArrayList<Integer>> hm, String name) {
    ArrayList<Integer> scores;
    scores = hm.get(name);
    if (scores == null) {
        System.out.println("NOT found");
    }

    int sum = 0;
    for (int x : scores) {
        sum += x;
    }
    return (float) sum / scores.size();
}

 // The best students from these Key-Value Pair

public static String getBestStudent(HashMap<String, ArrayList<Integer>> hm) {
    double max = 0;
    String beststudent = null;
    for (Map.Entry<String, ArrayList<Integer>> x : hm.entrySet()) {
        String name = x.getKey();
        double average = getAverage(hm, name);
        if (average > max) {
            max = average;
            beststudent = name;
        }
    }
    return beststudent;
}

public static void main(String[] args) {
    HashMap<String, ArrayList<Integer>> hm = new HashMap<>();
    hm.put("Peter", new ArrayList<>());
    hm.get("Peter").add(10);
    hm.get("Peter").add(10);
    hm.get("Peter").add(10);

    hm.put("Nancy", new ArrayList<>());
    hm.get("Nancy").add(7);
    hm.get("Nancy").add(8);
    hm.get("Nancy").add(8);

    hm.put("Lily", new ArrayList<>());
    hm.get("Lily").add(9);
    hm.get("Lily").add(9);
    hm.get("Lily").add(8);

    System.out.println("Find the average of the Peter");
    float num = getAverage(hm, "Peter");
    System.out.println(num);
    String name = getBestStudent(hm);
    System.out.println(name);
}

 }