【问题标题】:AS3 Array reordering on insertAS3 数组在插入时重新排序
【发布时间】:2013-11-25 19:37:16
【问题描述】:

我有一个应用程序,它允许用户通过简单地定义每个元素的索引来定义元素的顺序(元素是在运行时加载的 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

我尝试了很多方法,以至于我的大脑受伤了。我迷失在所有这些递归函数中,甚至不起作用。 如果有人知道执行这种重新排序的工作方式,那就太好了。

【问题讨论】:

    标签: arrays actionscript-3 apache-flex recursion


    【解决方案1】:

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

    为什么不使用(双)链表呢?所以每个元素都会有一个指向下一个元素的引用/链接(最后一个元素为空)。

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

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

    【讨论】:

      【解决方案2】:

      睡个好觉后,我想我会跳桥。 我能够用 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];
          }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        相关资源
        最近更新 更多