【问题标题】:Performing different behaviors based on object type in an array list根据数组列表中的对象类型执行不同的行为
【发布时间】: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 类。您能否详细说明我将如何使用它来奖励积分?部分信用方面是促使我这样做并将它们视为单独对象的一件事。我需要能够将数组中的每个元素与相应的答案键进行比较。

标签: java arrays arraylist


【解决方案1】:

据我了解,您的问题(您可能应该简化它以使其更清楚)是:

给定ArrayList&lt;Object&gt;,如何根据 ArrayList 的每个索引中的对象类型执行不同的行为?

答案是您可以使用instanceof 运算符来识别对象的子类型。

for (Object answer : studentAnswers) {
    if (answer instanceof String[]) {
        // Perform string array grading behavior
    } else if (answer instanceof boolean) {
        // Perform boolean grading behavior
    }
}

【讨论】:

  • 在不使用instanceof 的情况下,还有更好的方法可以按照您说的做。在这种情况下,它似乎是在用一种难闻的类型换另一种。
  • @ChiefTwoPencils 欢迎提出建设性的批评。告诉我我完全错了的批评是没有帮助的。
  • 评论不是这样。我没有说您“完全错误”,因为这表明它行不通;它会的。我不会重复自己,但敦促您再阅读一遍并考虑 if 的建设性。
  • @ChiefTwoPencils 我看到“与其他潜在实现相比,您的实现很差。”这不是建设性的 - 建设性会告诉我(或者,坦率地说,OP,因为他是需要知道的人)最好的实现是什么。
  • 无论如何,你希望我表现得好像我们是同事一样。如果您正在回答问题并且回答问题已经结束,那么教您一些您应该知道的东西不是我的责任,因为“正确”地做太多(广泛),但是因为您坚持。考虑到你还没有解决问题所在。他们担心拥有一个对象列表(有效)。您提供了一个解决方案,以一种僵化且难以维护的方法的形式在此之上构建气味。一个或两个额外的类是显而易见的,添加一个策略是另一个添加。
猜你喜欢
  • 2015-01-03
  • 2018-05-23
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多