从Hashset中删除项目

时间:2015-12-24 10:56:15

标签: java

我正在创建一个问答游戏。一些答案有其他答案,例如:

谁是俄罗斯总统?

  
      
  • Vladimir 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检查后,必须从Hashset中删除答案。 它适用于一个问题没有替代性的问题。

我怎样才能使这个工作?任何想法我做错了什么?

日Thnx!

2 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:3)

不应该使用for循环遍历元素并删除它们,这可能会导致异常(如果我没有记错,ConcurrentModificationException)。

HashSet提供了明确的iterator,您可以通过该{{3}}删除元素。

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; 
    }