2011-05-23 42 views
2

晚上好。我無法找到一個可以阻止我的程序內循環的條件。我會盡可能地嘗試和解釋它,所以這個問題可能會幫助其他人在相同的情況下:停止java迭代的條件

我有一個對象的集合。
使用循環內的一段代碼,我生成了更多的對象。
我想將這些對象添加到集合中。
一旦他們被添加,我想迭代他們,除非他們已經被迭代過。

僞代碼:

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()) {...}

回答

3

我建議使用2個集合:visited和toBeisited。訪問可能會被設置並被訪問 - 隊列。因此,只有在尚未訪問的情況下,才能將新項目添加到隊列中。當您將項目添加到隊列時,您也將其添加到Set。

+0

感謝您的想法。我不敢相信我沒有那樣想過。我會試一試,讓你知道。 – 2011-05-23 22:50:57

+0

這最終以一種魅力工作。 :) 非常感謝你。 – 2011-05-23 23:44:38

1

如果對象已經存在,添加到集合將不會執行任何操作。所以這不應該是一個問題。如果對象具有相同的標識(記得要覆蓋hashCode()equals(..)),但不同的其他領域,你可以用set.contains(..)

檢查,如果你想重複一些收集,修改它,而是繼續迭代的原單,然後在開始時複製副本,並迭代副本,同時添加到原始副本。

+0

我知道,但永遠循環仍在繼續。這就是我使用套件的部分原因,允許我避免使用.contains(),.containsAll()或檢查訂單。 :( – 2011-05-23 22:40:32

+0

然後看到我的第2段:) – Bozho 2011-05-23 22:41:24

+1

不會修改原始集合導致併發錯誤? – 2011-05-23 22:41:34

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

感謝您的輸入,最終使用了兩套(訪問和未訪問)來完成這項工作。授予遞歸方法看起來比我使用的更優雅... – 2011-05-23 23:45:24