Java中按索引对比两个ArrayList元素以计算测验得分的实现方法
问题原因分析
- 列表赋值反转:
storeCorrectAnswers()是获取正确答案的方法,却赋值给了存储用户答案的userAnswers变量;askQuestionsOneByOne()是获取用户作答的方法,反而赋值给了correctAnswers变量,基础赋值逻辑错误。 - 循环逻辑不符合需求:需求要求按相同索引逐位对比,不需要嵌套循环。当前嵌套循环会把两个列表的所有元素交叉匹配,只要两个列表存在相同值不管位置是否对应都会加分,完全不符合评分规则。
- 字符串对比方式错误:Java中
String是引用类型,==对比的是对象的内存地址而非字符串内容,应该使用equals()方法或者Objects.equals()做内容对比,后者还可以避免空指针异常。 - 缺少边界校验:如果两个列表长度不一致(比如用户漏答题目、题目数量配置错误),直接按索引遍历会触发数组越界异常。
正确实现代码
import java.util.ArrayList; import java.util.Objects; // 修正列表赋值逻辑 ArrayList<String> correctAnswers = storeCorrectAnswers(); ArrayList<String> userAnswers = askQuestionsOneByOne(); int score = 0; // 取两个列表的最小长度遍历,避免索引越界 int minSize = Math.min(correctAnswers.size(), userAnswers.size()); for (int i = 0; i < minSize; i++) { // 按相同索引取值,用Objects.equals对比内容,兼容空值场景避免空指针 if (Objects.equals(correctAnswers.get(i), userAnswers.get(i))) { score++; } } // 可根据业务需求选择是否增加长度校验逻辑 if (correctAnswers.size() != userAnswers.size()) { // 此处可替换为抛出异常、记录日志、未答题目按答错处理等业务逻辑 throw new IllegalArgumentException("正确答案数量与用户作答数量不匹配"); } return score;
内容的提问来源于stack exchange,提问作者Adwait Kulkarni
相关产品推荐
相关产品推荐

