我正在创建一个问答游戏。一些答案有其他答案,例如:
谁是俄罗斯总统?
- 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!
答案 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;
}