【发布时间】:2016-02-09 14:12:37
【问题描述】:
我正在实施一种考试评分系统。我会尽可能精简信息。 每个考试都可以有一个真题或假题(布尔值)、一个填空题(包含所有选项的字符串数组)和一个多项选择题(也是一个包含所有选项的字符串数组)。
每个参加考试的学生都有一份答题卡。答案可以是布尔值(对或错)或字符串数组(用于填空和选择题,因为选择题也可以有多个答案)。每次学生回答问题时,它都会被添加到答题卡中。
现在分级以这种方式发生。对于真假问题,很简单。如果答案是正确的奖励积分。但是对于填空题和选择题,则有部分计分,例如,如果学生选择正确的 2/3,他将获得 2/3 的分数。
我有一个名为 getExamScore(Exam a) 的方法。这是学生评分的地方。我决定创建一个答案键数组列表,其中包含每个问题的所有正确答案。问题编号是索引。示例:
`ArrayList<Object> answerKey = getExamAnswerKey(Exam a);`
System.out.println(answerKey);
//Outputs
[false, false, true, [A, C, D], [int, boolean, double];
我知道拥有对象数组列表通常是不好的做法,但我想不出更好的方法来收集所有答案以比较学生的答案。对于所有学生的答案,我都有一个类似的数组列表:
ArrayList<Object> studentAnswers = getStudentAnswer(Exam a);
System.out.println(studentAnswers);
//Outputs
[False, true, true, [A, C], [int, boolean]]
现在这就是我卡住的地方。当我在 getExamScore() 方法中对此进行评分时,我想检查 studentAnswers 的 answerKey 并查看要奖励多少分。但这并不是说if(studentAnswers[index].equals(answerKey[index])) score++;
因为字符串数组不能这样比较。所以我想有条件,如果 answerKey[index] 和 studentAnswers[index] 是一个字符串数组,有一个 for 循环来比较两者并奖励适当的点。如果它是一个真正的错误答案,简单地比较值,如果它是正确的,奖励积分。例如,示例学生的分数如下所示:
[1, 0, 1, 2/3, 2/3] for all the respective problems (partial credit included)
有人可以建议一种方法来实现这种分级设计吗?我也愿意批评我的数据结构选择。我知道对象的 ArrayList 有一种不好的代码气味,但我真的想不出任何其他方法来收集所有答案。
【问题讨论】:
-
你最好介绍一个类;这样它就是就像
if(student.answers[index].equals(teacher.answers[index])) score++;一样简单,顺便说一句,你的字符串数组([A, C, D])不是总是在ArrayList 的第4 位吗? -
请尽量缩小你的问题,让你的问题更清楚:你的很多介绍是不必要的,你的标题可以改进。否则,这是一个写得很好的问题,表明您在理解方面付出了努力。
-
我同意缩小范围的必要性。它可能会很多更短(一段+代码)并且不会失去任何价值或清晰度。
-
我确实用所有的词来推动长度,但我想充分解释我的难题,而不是不得不在 cmets 中一次又一次地澄清。不过,我会尽快编辑它。谢谢
-
@Kenney 你能解释一下添加另一个类有什么帮助吗?假设我创建了一个 AnswerType 类。您能否详细说明我将如何使用它来奖励积分?部分信用方面是促使我这样做并将它们视为单独对象的一件事。我需要能够将数组中的每个元素与相应的答案键进行比较。