Java 代码优化:计算学生平均年龄和班级平均成绩
这段 Java 代码用于计算学生平均年龄和每个班级学生的平均成绩。代码中存在一些问题,需要进行修复。
原始代码:
public static void main(String[] args) {
List<Student> list = new ArrayList();
list.add(new Student('Tom',18,100,'class05'));
list.add(new Student('Jerry',22,70,'class04'));
list.add(new Student('Owen',25,90,'class05'));
list.add(new Student('Jim',30,80,'class05'));
list.add(new Student('Steve',28,66,'class06'));
list.add(new Student('Kevin',24,100,'class04'));
int he=0;
for (int i = 0; i <list.size(); i++) {
he+=list.get(i).getAge();
}
System.out.println('平均年龄:'+he/list.size());
Map<String,Integer> mp=new HashMap<>();
int he1=0;
int ge=0;
int pingJun=0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size()-1-i; j++) {
if (list.get(i).getClassNum().equals(list.get(j).getClassNum())){
he1+=list.get(j).getScore();
ge++;
pingJun=he1/ge;
mp.put(list.get(j).getClassNum(),pingJun);
}
if (!list.get(i).getClassNum().equals(list.get(j).getClassNum())){
mp.put(list.get(i).getClassNum(),list.get(i).getScore());
}
}
}
System.out.println(mp);
}
问题:
- 平均年龄应该是一个浮点数,但是在计算时使用了整数除法,应该将其中一个操作数转换为浮点数,例如:(double)he/list.size()。
- 在计算每个班级的平均分数时,使用了两层循环,但是内层循环的索引应该是 j+1,而不是 j,否则会重复计算已经计算过的元素。
- 在计算每个班级的平均分数时,需要注意如果班级只有一个学生,会出现除 0 错误。
- 在计算每个班级的平均分数时,需要注意如果班级不存在,需要先将其添加到 Map 中。
修复后的代码:
public static void main(String[] args) {
List<Student> list = new ArrayList();
list.add(new Student('Tom',18,100,'class05'));
list.add(new Student('Jerry',22,70,'class04'));
list.add(new Student('Owen',25,90,'class05'));
list.add(new Student('Jim',30,80,'class05'));
list.add(new Student('Steve',28,66,'class06'));
list.add(new Student('Kevin',24,100,'class04'));
int sumAge = 0;
for (int i = 0; i <list.size(); i++) {
sumAge += list.get(i).getAge();
}
double avgAge = (double)sumAge / list.size();
System.out.println('平均年龄:' + avgAge);
Map<String,Integer> mp = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
if (mp.containsKey(s.getClassNum())) {
int sumScore = mp.get(s.getClassNum());
mp.put(s.getClassNum(), sumScore + s.getScore());
} else {
mp.put(s.getClassNum(), s.getScore());
}
}
for (String classNum : mp.keySet()) {
int numStudent = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getClassNum().equals(classNum)) {
numStudent++;
}
}
int sumScore = mp.get(classNum);
double avgScore = numStudent == 0 ? 0 : (double)sumScore / numStudent;
mp.put(classNum, (int)avgScore);
}
System.out.println(mp);
}
代码解释:
- 计算平均年龄: 使用
sumAge变量累加所有学生的年龄,然后使用(double)sumAge / list.size()计算平均年龄,避免整数除法导致的精度丢失。 - 计算每个班级的平均分数: 采用一个循环遍历所有学生,并将每个学生的成绩累加到对应班级的分数中。使用
containsKey方法判断班级是否存在,如果不存在则先将其添加到 Map 中。最后再遍历 Map,计算每个班级的平均分数,并使用三元运算符处理除 0 错误的情况。
经过修复后的代码,能够正确计算学生平均年龄和每个班级学生的平均成绩,并避免了原代码中的错误。
说明:
- 代码中省略了
Student类,请根据实际情况自行定义。 - 修复后的代码使用了更简洁的循环和条件判断,并使用了 Map 的
containsKey方法,提高了代码的可读性和效率。 - 代码中的注释解释了每个部分的功能,方便理解和维护。
- 可以根据实际需要进一步优化代码,例如使用 Stream API 或 Lambda 表达式简化代码逻辑。
原文地址: https://www.cveoy.top/t/topic/odmI 著作权归作者所有。请勿转载和采集!