Java SQLite测验系统答案列表累加异常问题求助
问题分析与解决方案
看起来你遇到的核心问题是存储选中答案的集合没有在切换题目时重置——这就导致每加载一道新题,上一题的选中项都会被保留在列表里不断累加,自然和正确答案的比对完全失效了。结合你的代码逻辑,我给你梳理下具体的修复步骤:
1. 定位问题根源
你用来存储当前题目选中答案的List对象(比如selectedAnswers)大概率是类级别的成员变量,而且每次切换题目时没有调用clear()方法清空。比如第一题选了ID1,列表是[1];第二题加载时没清空,再选ID1就变成[1,1],以此类推。
2. 修复showQuestion方法
在加载新题目之前,必须先清空选中答案列表,同时重置4个复选框的选中状态(避免视觉上的混淆):
public void showQuestion(int questionIndex) { // 第一步:清空选中答案的集合 selectedAnswers.clear(); // 第二步:重置所有复选框的选中状态 checkboxOption1.setSelected(false); checkboxOption2.setSelected(false); checkboxOption3.setSelected(false); checkboxOption4.setSelected(false); // 第三步:加载当前题目的内容与选项(你的原有逻辑) Question currentQuestion = getQuestionByIndex(questionIndex); questionLabel.setText(currentQuestion.getQuestion()); // 给4个复选框设置对应选项文本和绑定的答案ID // ... 你的选项赋值逻辑 }
3. 调整「下一题」的点击逻辑
要严格遵循「收集当前题选中项 → 比对计分 → 加载新题」的顺序,确保每一步的状态都是独立的:
nextQuestionBtn.addActionListener(e -> { // 1. 收集当前题的选中答案(先清空再收集,避免残留) collectCurrentSelectedAnswers(); // 2. 比对正确答案并更新分数 List<Integer> trueAnswers = getTrueAnswer(currentQuestion.getId()); if (compareSelectedAndTrue(selectedAnswers, trueAnswers)) { totalScore++; } // 3. 切换到下一题 currentQuestionIndex++; if (currentQuestionIndex < totalQuestionCount) { showQuestion(currentQuestionIndex); } else { // 所有题目完成,显示最终结果 showQuizResult(totalScore); } });
4. 完善collectCurrentSelectedAnswers方法
确保这个方法每次都重新收集当前题的选中项,而不是追加到旧列表:
private void collectCurrentSelectedAnswers() { selectedAnswers.clear(); // 双重保险,先清空 if (checkboxOption1.isSelected()) { selectedAnswers.get(option1.getAnswerId()); // 这里要取当前题对应选项的ID } if (checkboxOption2.isSelected()) { selectedAnswers.get(option2.getAnswerId()); } if (checkboxOption3.isSelected()) { selectedAnswers.get(option3.getAnswerId()); } if (checkboxOption4.isSelected()) { selectedAnswers.get(option4.getAnswerId()); } }
5. 优化多选比对逻辑
List.equals()会严格要求元素顺序一致,但用户选多选的顺序可能和数据库里正确答案的顺序不一样,建议先排序再比对:
private boolean compareSelectedAndTrue(List<Integer> selected, List<Integer> trueAnswers) { if (selected.size() != trueAnswers.size()) { return false; } // 排序后再比对,避免顺序影响结果 Collections.sort(selected); Collections.sort(trueAnswers); return selected.equals(trueAnswers); }
最后再检查下变量作用域:如果selectedAnswers是局部变量,那要确保每次收集选中项时都新建一个ArrayList(比如List<Integer> selectedAnswers = new ArrayList<>();),而不是复用旧的对象。
内容的提问来源于stack exchange,提问作者Dev web
相关产品推荐
相关产品推荐

