AS3阵列在插入时重新排序

时间:2013-11-25 19:37:16

标签: arrays actionscript-3 flex recursion

我有一个应用程序,允许用户通过简单地在每个元素上定义索引来定义元素的顺序(元素是在运行时加载的xml文件)。

规则很简单,索引越高,图层堆栈中的元素越高(就像CSS中的z-index)。 但是如果在同一个索引处有2个元素,我必须在现有元素之后添加最后一个元素。并且,如果采用新的计算索引,我必须移动列表的内容以放置放置新项目的位置。这是递归的。

以下是结构的样本:

+---+--------------+
| 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

我已经尝试了很多方法让我的大脑受伤。我迷失在所有这些递归功能中,甚至不起作用。 如果有人知道执行此重新排序的工作方式,那将非常棒。

2 个答案:

答案 0 :(得分:0)

所以你要创建一个类似数组的结构。

为什么不使用(双)链表呢?因此每个元素都有一个引用/链接到下一个元素(最后一个元素将为null)。

如果要插入元素,则只需使用新链接更新两个项目......

或者,如果您使用Array,请使用splice方法插入新项目。

答案 1 :(得分: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];
    }

如果您看到更简单的方法,请不要犹豫。