
本文详解如何修复学生选择数据统计逻辑错误:原始代码仅处理答案为 0 的情况,且未适配“每组两个选项(如 apple/pear)对应一个答案位”的实际结构,导致统计仅覆盖一半选项、结果失真。
本文详解如何修复学生选择数据统计逻辑错误:原始代码仅处理答案为 0 的情况,且未适配“每组两个选项(如 apple/pear)对应一个答案位”的实际结构,导致统计仅覆盖一半选项、结果失真。
在处理基于成对选项(如 Apple Pear、Dog Cat)的问卷数据时,常见设计是:每组两个互斥选项用一个二进制值表示选择——0 表示选第一个,1 表示选第二个。CSV 数据格式通常为:
Alice,0,1,0,... Bob,1,0,1,...
其中每行代表一名学生,后续字段为长度为 N 的 0/1 序列,对应 N 组选项(即共 2N 个候选词)。此时,answers[i] 并不直接映射到 choices.get(i),而应映射到第 i 组中的两个具体选项:choices.get(i * 2)(0 所选)和 choices.get(i * 2 + 1)(1 所选)。
原始实现存在两个关键缺陷:
- ❌ 逻辑不完整:仅处理 answers[i] == 0,忽略 == 1 的分支,导致一半选择未被统计;
- ❌ 索引错位:将 answers[i] 错误关联至 choices.get(i),而实际应映射至 choices.get(i * 2) 和 choices.get(i * 2 + 1)。
✅ 正确做法是:遍历每位学生的答案数组,对每个 i,根据 answers[i] 的值,精准递增对应选项的计数器。
以下是修正后的 classSummary() 方法:
public static void classSummary() {
for (Student student : data) {
int[] answers = student.getAnswers();
for (int i = 0; i < answers.length; i++) {
if (answers[i] == 0) {
// 选择第 i 组的第一个选项(索引 i*2)
choices.get(i * 2).incrementCount();
} else if (answers[i] == 1) {
// 选择第 i 组的第二个选项(索引 i*2+1)
choices.get(i * 2 + 1).incrementCount();
}
// 可选:添加 else 分支处理非法值(如 -1、2),提升健壮性
else {
System.err.println("Warning: Invalid answer value " + answers[i] + " at index " + i);
}
}
}
}? 建议优化点:
- 将 setCount(getCount() + 1) 封装为 incrementCount() 方法,提高可读性与复用性;
- 在循环前校验 answers.length * 2
- 若 choices 是 List
,确保其容量严格等于 2 * answers.length(即 50 对 → 100 个选项),否则需统一初始化逻辑。
最终,该修正确保所有 100 个选项(50 对)均被准确、无遗漏地统计,输出的汇总结果真实反映全班选择分布。










