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

时间:2014-02-09 22:58:01

标签: java

在Student课程中,我需要添加一种方法,将新课程纳入学生的课程集合,以及计算和返回学生平均成绩的方法。当我试图计算学生的平均成绩时,我不断得到“NaN”。非常感谢任何帮助。谢谢。

以下是Student类的源代码。

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);
    }
}

4 个答案:

答案 0 :(得分:4)

你的方法

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

对我来说很有趣。如果地图中已经有至少一门课程,您是否打算只添加一门课程?这样,第一道菜将如何进入地图?

我认为你试图检查地图是否存在,但这样做会有所不同,即:

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

关于分裂问题,请看Saposhiente的另一个答案。我只会重复一遍......

答案 1 :(得分:2)

int counter = 0;
return (averageGrade /= counter);

NaN表示除以零之外的其余部分。计数器从未增加,因为没有添加课程;看到luksch的答案为什么。此外,由于您再也不会引用averageGrade,您只需使用

即可
return averageGrade / counter;

效率稍高。

答案 2 :(得分:1)

它返回NaN的唯一方法是当courses.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);
    }

答案 3 :(得分:1)

这里使用简单的HashMap技术,参考下面的代码进行Caluclating 平均并从中找到 Beststudent ,了解它,我可以帮助你 感谢...

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);
}

 }