停止java迭代的条件

时间:2011-05-23 22:36:49

标签: java loops while-loop conditional-statements break

晚上好。我找不到一个可以阻止程序循环的条件。我将尝试尽可能一般地解释它,所以这个问题可能会在同样的情况下帮助其他人:

我有一系列物品 使用循环内的一段代码,我会生成更多对象 我想将这些对象添加到集合中 一旦它们被添加,我想迭代它们,除非它们之前被迭代过。

伪代码:

While (!everyObjectHasBeenIteratedOver){
    for (Object o : SetOfObjects){
        // Generate an unknown number of objects
        // Add those objects to the SetOfObjects unless they're already there
    }
}

所以基本上就是这样。 我知道的唯一答案是使用Lists,它支持在迭代列表中添加元素而不会分解,但我个人使用的是HashSets。

有什么想法吗?

先谢谢了。

编辑:结束使用访问对象的集合和未访问的另一个集合 条件:while (!notVisited.isEmpty()) {...}

3 个答案:

答案 0 :(得分:3)

我建议使用2个集合:visited和toBeVisited。访问过的可能是Set和toBeVisited - Queue。因此,只有在尚未访问的情况下才将新项目添加到队列中。当您向Queue添加项目时,您还将其添加到Set。

答案 1 :(得分:1)

如果对象已经存在,添加到集合将不会执行任何操作。所以这应该不是问题。如果对象具有相同的身份(请记得覆盖hashCode()equals(..)),但不同的其他字段,您可以查看set.contains(..)

如果你想迭代一些集合,修改它,但继续迭代原始集合,然后在开始时复制,并迭代副本,同时添加到原始集合。

答案 2 :(得分:1)

我采取递归方法

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