[英]Report on a multimap by producing a new map of each key mapped to the count of elements in its collection value
[英]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);
}
}
然后,如果符合条件,则可以使用此辅助方法添加项目,并递归处理添加的项目。 请注意,如果它们是局部变量,则需要更改方法签名以传入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);
}
}
}
我没有你的代码,所以我无法测试。 这个想法应该可以正常工作,但您可能需要稍作修改。
如果将它们添加到列表的末尾并使用索引和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.