Java 如何使用HashMap计算学生的平均成绩?
在学生课程中,我需要添加一个方法,将新课程放入学生的课程集合,以及一个计算并返回学生平均成绩的方法。当我试图计算学生的平均成绩时,结果总是得到NaN。非常感谢您的帮助。谢谢 下面是我的学生课程的源代码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
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);
}
}