问题描述
|
晚上好。我无法找到条件来停止程序内部的循环。我将尝试尽可能全面地解释它,以便该问题可能会帮助处于相同情况的其他人:
我有一些物件。
在循环内有一段代码,我生成了更多对象。
我想将这些对象添加到集合中。
一旦添加了它们,我想对其进行迭代,除非之前已经对其进行了迭代。
伪代码:
While (!everyObjectHasBeenIteratedOver){
for (Object o : SetofObjects){
// Generate an unkNown number of objects
// Add those objects to the SetofObjects unless they\'re already there
}
}
基本上就是这样。
我知道的唯一答案是使用列表,该列表支持在迭代列表上添加元素而不拆分,但是我个人使用的是HashSets。
有任何想法吗?
先谢谢了。
编辑:最后使用一组访问对象,另一组用于未访问对象。
条件:while (!notVisited.isEmpty()) {...}
解决方法
我建议使用2个集合:访问和toBeVisited。可以设置访问者并设置为访问-队列。因此,仅当尚未访问新项目时,才将其添加到队列中。并且,当您将项目添加到队列时,您也将其添加到集合。
,如果对象已经存在,则添加到集合将不会执行任何操作。因此,这应该不是问题。如果对象具有相同的标识(记住覆盖override2ѭ和
equals(..)
),但其他字段不同,则可以使用set.contains(..)
进行检查。
如果要迭代某个集合,请对其进行修改,但继续对原始集合进行迭代,然后在开始时制作一个副本,并在添加到原始副本的同时迭代该副本。
,我会采取递归方法
public doSomething(Collection<Object> doTo,Set<Object> beenDone) {
for(Object o : collection) {
Collection<Object> newObjects = createObjects(0);
doSomething(newObjects,beenDone);
beenDone.add(o);
}
return beenDone;
}
public mainIteration(Collection<Object> collection) {
Set<Object> operatedOn = new HashSet<Object>();
doSomething(collection,operatedOn);
}