根据数组列表中的对象类型执行不同的行为

时间:2015-11-09 00:02:01

标签: java arrays arraylist

我正在实施一种考试评分系统。我会尽可能简化信息。 每个考试都可以有一个真或假的问题(布尔值),空白填充问题(包含所有选项的字符串数组)和多项选择题(也是包含所有选项的字符串数组)。

每个参加考试的学生都有答题纸。答案可以是布尔值(对于true或false)或字符串数​​组(用于填充空白和多项选择题,因为多项选择题也可以有多个答案)。每当学生回答问题时,它都会被添加到答题纸中。

现在评分就是这样发生的。对于真假问题,它很简单。如果答案是正确的,则奖励积分。但是为了填补空白和多项选择的部分功劳,如果学生有2/3的选择权,例如,他得到2/3的分数。

我有一个名为getExamScore的方法(考试a)。这是学生获得评分的地方。我决定创建一个答案密钥数组列表,其中包含每个问题的所有正确答案。问题编号是索引。例如:

`ArrayList<Object> answerKey = getExamAnswerKey(Exam a);`
System.out.println(answerKey);
//Outputs
[false, false, true, [A, C, D], [int, boolean, double];

我知道有一个对象的数组列表通常是不好的做法但我无法想出一个更好的方法来收集所有的答案来比较学生的答案。对于所有学生的答案,我有一个类似的arrayList:

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有一个糟糕的代码味道,但我真的无法想到收集所有答案的任何其他方式。

1 个答案:

答案 0 :(得分:-1)

我理解你的问题(你应该简化它以使其更清楚)是:

  

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

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

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