在我开始我的问题之前,我想提一下我确实阅读了一些其他主题并且我试了一下但我真的很困惑 atm 所以我想我只是问一下。
所以我想做的是通过一个 Set 对每个使用,并在其中为每个使用,向该集合添加元素并循环访问这些元素。 我在其他地方找到的解决方案如下:
for(Object obj : new HashSet<Object>(oldSet))
我试过了,但是我总是遗漏了一些我想匹配的最后元素,所以我不确定这是否是正确的方法?
具体来说,我的代码基本上是这样的:
for(Position pos : new HashSet<Position>(oldSet){
for(Delta delta : deltas){
if(board.getTokenAt(pos.plus(delta).equals(initial){
hitList.add(pos.plus(delta);
oldSet.add(pos.plus(delta);
}
}
oldSet.remove(pos);
}
同样,我只想知道我的方法是否错误,或者我的代码中其他地方一定有错误,以便我知道要查看的内容。 提前致谢!
最佳答案
您不能在迭代数据结构时真正向其添加内容,这几乎肯定会产生意想不到的结果。
但是,对于您的问题,有一个足够简单的解决方案。只需在发现需要添加的时候递归处理每一项,将其添加到单独的List
即可。在迭代结束时,将 List
中的所有内容添加到主 Set
中。这避免了在迭代期间添加的问题,同时仍然允许您处理新添加的项目。
它看起来像这样:
List<Position> toAdd = new LinkedList<>();
for(Position pos : oldSet){
for(Delta delta : deltas){
addIfGoodAndRecurse(pos, delta, toAdd);
}
}
然后您可以使用此辅助方法来添加满足您条件的项目,并递归处理添加的项目。请注意,您需要更改方法签名以传入您的 board
、initial
和 hitList
(如果它们是局部变量)。我不知道它们的类型,也不知道它们是全局变量还是字段,所以我无法在示例中真正添加它们。
private void addIfGoodAndRecurse(Position pos, Delta delta, List<Position> toAdd) {
Position toCheck = pos.plus(delta);
if(board.getTokenAt(toCheck.equals(initial))) {
hitList.add(toCheck);
toAdd.add(toCheck);
for (Delta recursionDelta : deltas) {
addIfGoodAndRecurse(toCheck, recursionDelta, toAdd);
}
}
}
我没有你的代码,所以我不能测试这个。这个想法应该可以正常工作,但您可能需要稍作修改。
关于java - 在 :each 中包含新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910485/