我有一个应用程序,允许用户通过简单地在每个元素上定义索引来定义元素的顺序(元素是在运行时加载的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
。
我已经尝试了很多方法让我的大脑受伤。我迷失在所有这些递归功能中,甚至不起作用。 如果有人知道执行此重新排序的工作方式,那将非常棒。
答案 0 :(得分:0)
所以你要创建一个类似数组的结构。
为什么不使用(双)链表呢?因此每个元素都有一个引用/链接到下一个元素(最后一个元素将为null)。
如果要插入元素,则只需使用新链接更新两个项目......
或者,如果您使用Array,请使用splice
方法插入新项目。
答案 1 :(得分:0)
结果如下。
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];
}
如果您看到更简单的方法,请不要犹豫。