2011-06-12 71 views
2

雖然遞歸掃描通常用於掃描嵌套的對象/數據。如果某些對象相互引用,它可以進行無限循環。那麼掃描所有項目的最有效方法是什麼,不會造成計算機崩潰,也不會跳過指定的參數?AS3遞歸對象掃描無重複?

這裏是一個遞歸掃描儀的一個例子...

/** 
* Triggers the scan function for each object given 
**/ 
function recursiveScanner(object:* , scanFunction:Function):void { 
    if(typeof(object) == 'object') { 
     for(var key:String in object) { 
      recursiveScanner(object[key], scanFunction); 
     } 
    } else { 
     scanFunction.call(this, object); 
    } 
} 

//... 
obj1.next = obj2; 
//... 
obj2.next = obj3; 
//... 
obj3.next = obj1; 
//... 
recursiveScanner(obj1, scanFuction); 

的對象傳遞時,以下將觸發掃描對彼此在發生。然而一個巨大的問題永恆的循環。那麼有沒有辦法解決這個問題?

我確實相信C/C++:每次scanFunction調用,都會被添加到由掃描的「內存地址」組成的列表中,從而防止重複。這在AS3中甚至可能嗎?有更加優雅的方式嗎?

回答

10

使用Dictionary讓掃描對象的列表,而忽略他們,如果他們之前已經被掃描:

/** 
* Triggers the scan function for each object given 
**/ 
function recursiveScanner(object:* , scanFunction:Function, ignoreList:Dictonary = null):void { 
    // if we have no list, create one 
    if (!ignoreList) ignoreList = new Dictionary(); 

    // if the item is in the list, we bail 
    if (ignoreList[object]) return; 

    // mark the item as scanned before recursing into it 
    ignoreList[object] = true; 

    if(typeof(object) == 'object') { 
     for(var key:String in object) { 
      recursiveScanner(object[key], scanFunction, ignoreList); 
     } 
    } else { 
     scanFunction.call(this, object); 
    } 
} 
+0

Ahh ...對象ID將在字典中用作屬性... Thx爲解決方案=) – PicoCreator 2011-06-14 12:24:46

2

OK,接受來自@grapefrukt答案,但這裏是一些背景。

在計算機科學術語中,該問題等同於遍歷可包含循環的directed graph

基本上有兩種天真的方式(即,不遵循啓發式)來遍歷,depth firstbreadth first

我將其留作練習以確定示例代碼是BFS還是DFS。

+0

深度優先:)對於我首先在廣度上進行部署,我將不得不閱讀在我的部署中沒有重複的所有節點。因此從BFS獲得FIFO是不必要的成本。 Thx對於良好的閱讀和參考無論如何=)在這之前不知道回合BFS :)將在未來TY有用 – PicoCreator 2011-06-14 12:22:34