在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);
}
}
答案 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);
}
}