2015-11-08 116 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();