2013-11-25 82 views
0

我有一個應用程序,允許用戶通過簡單地定義每個元素上的索引(元素是在運行時加載的xml文件)來定義元素的順序。AS3插入數組重新排序

規則很簡單,索引越高,層堆棧中的元素越高(就像CSS中的z-index一樣)。 但是,如果在同一索引處有兩個元素,則必須在現有元素之後添加最後一個元素。而且,如果採用新的計算索引,我必須移動列表的內容來放置新項目。這是遞歸的。

這裏的結構是什麼樣子的樣本:

+---+--------------+ 
| 1 | lowest item | 
+---+--------------+ 
| 2 | lower item | 
+---+--------------+ <== if I add an element at the index 3, there is no problem 
| 4 | higher item | 
+---+--------------+ 
| 9 | highest item | 
+---+--------------+ 

但是,如果該指數3已經被佔用,我剛纔之後插入新的項目,在指數4.如果在4已被使用過,我有現有的4移動到指數5放置新的項目,而這一點,遞歸....

+---+---------------+   +---+-------------------+ 
| 1 | item 1  |   | 1 | item 1   | 
+---+---------------+   +---+-------------------+ 
| 2 | item 2  |   | 2 | item 2   | 
+---+---------------+   +---+-------------------+ 
| 3 | already taken |  ==> | 3 | already taken  | 
+---+---------------+   +---+-------------------+ 
| 4 | item 4  |   | 4 | << NEW ITEM 3 >> | 
+---+---------------+   +---+-------------------+ 
| 9 | item 5  |   | 5 | previously item 4 | 
+---+---------------+   +---+-------------------+ 
           | 9 | item 5   | 
           +---+-------------------+ 

元素的數量可以改變,並且列表不總是開始索引1. 例如,列表可以包含索引:1, 2, 3, 5, 10以及30, 32, 52, 9999

我已經嘗試過這麼多方法,我的大腦受傷。我迷失在所有這些遞歸函數中,甚至不起作用。 如果有人知道執行這種重新排序的工作方式,那將非常棒。

回答

0

經過一個良好的睡眠,我想我會跳橋。 我能用4行的2個函數解決我的問題。對我感到羞恥。

這是結果。

public function add(index:int, item:Object):void 
    { 
     if(index in _list){ 
      index++; 
      move(index); 
     } 
     _list[index] = item; 
    } 
    private function move(index:int):void 
    { 
     if(index+1 in _list){ 
      move(index+1); 
     } 
     _list[index+1] = _list[index]; 
     delete _list[index]; 
    } 

如果你看到一個更簡單的方法來做到這一點,不要猶豫,說出來。

0

所以你正在創建一個類似數組的結構。

爲什麼不使用(雙)鏈接列表呢?所以每個元素都有一個到下一個元素的引用/鏈接(最後一個元素將爲null)。

如果要插入你需要新的鏈接,只更新兩個項目元素......

或者,如果你使用的陣列使用splice方法插入新的項目。