2013-11-25 51 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方法插入新的项目。