2015-11-08 47 views
0

因此,我创建了一个具有getExamScore(Student a,int examId)方法的考试分级系统。此方法将检索指定考试的答案关键字,该答案是该考试的学生答卷,并评估学生获得的点数。这是它做什么的粗略草图。计算arrayList中相同元素的数量

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如果答案匹配从点ArrayList中的相应指标的综合得分在其中添加点。我尝试了下面的代码,它可以工作,但它有点难以理解。有没有更好的方法来做到这一点?我愿意提出改变我的设计的建议。我只是认为这将是最简单的方法。

int i = 0; 
    for(String s: studentAnswer){ 
       if(s.equals(answerKey.get(i))){ 
        score += points.get(i); 
       } 
       i++; 
      } 

回答

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(); 

更改studentAnswersMap<Integer, String>

studentAnswers.entrySet().stream() 
    .mapToDouble(e -> answerKey.get(e.getKey()).equals(e.getValue()) ? points.get(e.getKey()) : 0) 
    .sum(); 
0

不看的细微差别Ô你的代码,看起来你的做法很尴尬,例如Map<Integer, Question>是无用的。

记录哪个答案对于问题是正确的最自然的方法是正确答案的问题字段,或者解耦使用Map<Question, Answer>,或者如果多个选择是“正确答案”,那么是Set<Answer>,但它不会不改变这个解决方案:

Map<Question, Answer> correct; 
Map<Question, Answer> actual; 

int total = actual.entrySet().stream() 
    .filter(e -> e.getValue().equals(correct.get(e.getKey())) 
    .mapToInt(e -> e.getKey().getScore()) 
    .sum();