繁体   English   中英

包括for:for each中的新元素

[英]Including new elements in for:each

在我开始提问之前,我想提一下,我读了一些其他主题,我尝试了一下,但我真的很困惑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);
  }
}

然后,如果符合条件,则可以使用此辅助方法添加项目,并递归处理添加的项目。 请注意,如果它们是局部变量,则需要更改方法签名以传入boardinitialhitList 我不知道他们的类型或者它们是全局变量还是字段,所以我无法在示例中添加它们。

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

我没有你的代码,所以我无法测试。 这个想法应该可以正常工作,但您可能需要稍作修改。

如果将它们添加到列表的末尾并使用索引和get()方法而不是通过Iterator迭代它,则可以迭代添加到您正在迭代的列表中的新元素。 您也可以像现在一样使用Set,但仅限于确保只向集合中添加唯一项。

List<Position> list = new ArrayList<>(oldSet);
for (int i = 0; i < list.length; ++i) {  // NB list.length could be different each time
  Position pos = list.get(i);
  for(Delta delta : deltas){
    if(board.getTokenAt(pos.plus(delta).equals(initial){
      hitList.add(pos.plus(delta));
      if (oldSet.add(pos.plus(delta)))  // Check if it already exists in the list
          list.add(pos.plus(delta));
    }
  }
  oldSet.remove(pos);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM