Java比较ArrayList内Baby姓名 修复findTwoSameBabies方法错误
问题定位
你的findTwoSameBabies方法无法正确判断重名婴儿,存在2个核心逻辑错误,另外代码中平均年龄计算还存在1个隐藏精度问题:
- 循环冗余嵌套:你额外加了一层遍历列表的增强for循环,两两比较姓名只需要两层索引循环即可,多余的外层循环会造成无意义的重复遍历。
- 比较对象完全错误:判断重名的条件里,你拿婴儿姓名和
babiesList.size()(列表的长度,是int类型整数)做相等判断,根本没有对比两个不同婴儿的姓名,永远不可能得到正确的匹配结果。 - 平均年龄计算精度丢失:
calculateAndPrintBabiesAverageAge方法中两个int类型值做除法时会默认走整数除法,截断小数部分,就算赋值给double类型变量也无法得到正确的浮点结果。
修复后代码
修复后的重名判断方法
private static void findTwoSameBabies(ArrayList<Baby> babiesList) { boolean sameBaby = false; // 两层循环完成所有两两组合的比较,移除多余的外层增强for循环 for(int i = 0; i < babiesList.size(); i++) { for(int j = i + 1; j < babiesList.size(); j++) { // 正确对比i、j两个位置的婴儿姓名 if(babiesList.get(i).getName().equalsIgnoreCase(babiesList.get(j).getName())) { sameBaby = true; break; } } if(sameBaby) { break; } } if(sameBaby) { System.out.println("Two babies in the array are the same"); } else { System.out.println("No same baby in the array"); } }
修复后的平均年龄计算方法
private static double calculateAndPrintBabiesAverageAge(ArrayList<Baby> babies) { int totalAge = 0; for (Baby babie : babies) { totalAge += babie.getAge(); } // 先把总年龄转为double再做除法,避免整数除法截断小数 double averageAge = (double) totalAge / babies.size(); return averageAge; }
逻辑说明
修复后重名判断逻辑会遍历列表中所有婴儿的两两组合,只要存在任意两个姓名忽略大小写相等的婴儿,就会输出重名提示;遍历完所有组合都没有重名才会输出无重名提示,平均年龄计算也会保留正确的小数结果。
内容的提问来源于stack exchange,提问作者T4ctician
相关产品推荐
相关产品推荐

