因此,我正在创建一个具有getExamScore(Student a,int examId)方法的考试评分系统。此方法检索指定考试的答案密钥,该考试的学生答题表,并评估学生获得的分数。这是它的作用的粗略草图。
Exam toIterate = database.get(examId);
Map<Integer, Question> map = toIterate.getMap();
for(Map.Entry<Integer, Question> entry : map.entrySet()){
answerKey.add(entry.getAnswer());
points.add(entry.getPoints());
}
System.out.println(answerKey);
System.out.println(points);
//Outputs
[False, True, False]
[2.0, 4.0, 3.0]
现在,我在某个地方有一个单独的方法,可以将所有学生的答案添加到arraylist中。
Student s = new Student();
AnswerSheet as = s.getAnswerSheet(int examId);
ArrayList<String> studentAnswers = as.getAnswers(int examId);
System.out.println(studentAnswers);
//Ouputs
[False, True, False]
现在我想将answerKey与studentAnswers进行比较,如果答案匹配,则将相应索引处的pointsList中的点添加到总分。我尝试了以下代码并且它可以工作,但这是一个有点丑陋的解决方案。有更优雅的方式吗?我也愿意接受改变我的设计的建议。我只是认为这是最简单的方法。
int i = 0;
for(String s: studentAnswer){
if(s.equals(answerKey.get(i))){
score += points.get(i);
}
i++;
}
答案 0 :(得分:0)
使用您当前的设计
answerKey.entrySet().stream()
.mapToDouble(e -> e.getValue().equals(answers.get(e.getKey())) ? points.get(e.getKey()) : 0)
.sum();
使用问题地图
questions.entrySet().stream()
.mapToDouble(e -> e.getValue().getAnswer().equals(answers.get(e.getKey())) ? e.getValue().getPoints() : 0)
.sum();
将studentAnswers
更改为Map<Integer, String>
studentAnswers.entrySet().stream()
.mapToDouble(e -> answerKey.get(e.getKey()).equals(e.getValue()) ? points.get(e.getKey()) : 0)
.sum();
答案 1 :(得分:0)
不看代码的细微差别,看起来你的方法很尴尬,例如Map<Integer, Question>
没用。
记录哪个答案对于某个问题是正确的最自然的方法是使用正确答案的字段,或者使用Map<Question, Answer>
来解耦,或者如果多个选项是“正确答案”,那么{ {1}}但它不会改变此解决方案:
Set<Answer>