2015-12-24 151 views
2

我正在創建一個測驗遊戲。一些答案有其他答案,例如:從哈希集中刪除項目

誰是俄羅斯總統?

  • 弗拉基米爾Poetin
  • Poetin

這裏是代碼:

for (HashSet<String> answer : answers) { 
    for (String alternative : answer) { 
     // Apply levensthein 
     int distance = levensthein(givenAnswer, alternative); 
     double ratio = ((double) distance)/(Math.max(alternative.length(), givenAnswer.length())); 
     // 20 % error margin 
     if (ratio <= 0.2) { 
      // remove this set of answers, so you can't try in the same answer again 
      answers.remove(answer); 
      return true; 
     } 
    } 
} 

後levensthein檢查答案必須從​​被刪除。 它適用於當問題沒有其他選擇時。

我該如何得到這個工作?任何想法我做錯了什麼?

thnx!

+2

使用收集的 '迭代器()' 方法。 – z21

回答

4

增強for循環不適合從正在迭代的集合中刪除元素。改爲使用顯式迭代器。

Iterator<HashSet<String>> aIter = answers.iterator(); 
while (aIter.hasNext()) { 
    HashSet<String> answer = aIter.next(); 
    Iterator<String> iter = answer.iterator(); 
    while (iter.hasNext()) { 
     String alternative = iter.next(); 
     // Apply levensthein 
     int distance = levensthein(givenAnswer, alternative); 
     double ratio = ((double) distance)/(Math.max(alternative.length(), givenAnswer.length())); 
     // 20 % error margin 
     if (ratio <= 0.2) { 
      // remove this set of answers, so you can't try in the same answer again 
      aIter.remove(); 
      return true; 
     } 
    } 
} 
+0

非常感謝!在幾分鐘內我可以將它標記爲答案:) – Ferryzijl

3

不應該使用一個for循環走了過來元素並刪除它們,這可能會導致異常(如果我沒有記錯的話,ConcurrentModificationException)。

HashSet提供了一個明確的iterator,通過它您可以刪除元素。

for (HashSet<HashSet<String>> answer : answers) {需要成爲:

Iterator<String answerIter = answers.iterator(); 
while(answerIter.hasNext()) { 
    HashSet<string> answer = answerIter.next(); 
    ... 
    if (ratio <= 0.2) { 
     answerIter.remove(); 
     return true; 
    }