如何在actionscript 3中生成动态链表

时间:2016-09-28 12:41:46

标签: list actionscript-3

我正坐在一个问题上。我正在学习链表(因为我需要这个后来的树解决方案)并尝试动态创建链接。显然我有问题在对象之间生成链接。

这是代码

public function Main()
    {
        var node1:Object = {value: 1};
        var node2:Object = {value: "foo"};
        var node3:Object = {value: "bar"};
        var node4:Object = {value: "test"};


        for (var a:int = 1; a < 4 ; a++)
        {
            if (a < 3)
            {
            node[a].next = node[a + 1];
            }
            else
            {
                node[a].next = null;
            }

        }
        // ((node1.next = node2).next = node3).next = null; works, but 
        // not the code above


        var n:Object = node1;
        while (n)
        {
            trace(n.value);
            var jsonString:String = JSON.stringify(n);
            trace(jsonString);

            n = n.next;
        }
    }

我能解释一下吗?

我知道对象不是数组,但应该可以将指针放在正确的位置。我很确定,这可能是一个动态的解决方案。我真的尝试了不同的符号。你有提示吗?

2 个答案:

答案 0 :(得分:1)

实际问题是您为节点列表创建变量。然后,您尝试使用这些名称来访问对象。相反,只需在类似的数组中创建它们(代码未经过测试)

public function Main()
{
    var nodes:Array = [{value: 1}, {value: "foo"}, {value: "bar"}, {value: "test"}];

    for each(var a:int = 0; a < nodes.length - 1 ; a++)
    {
        nodes[a].next = nodes[a + 1];
    }

    var n:Object = nodes[0];
    while (n)
    {
        trace(n.value);
        var jsonString:String = JSON.stringify(n);
        trace(jsonString);
        n = n.next;
    }
}

由于多种原因,您当前的解决方案很糟糕。它不是很灵活。如果要将一个节点添加到列表中,则必须创建一个具有适当名称的新变量(否则它将不会被循环拾取)您还必须修改循环中的硬编码上限。在代码中冗余地使用相同的信息是维护的噩梦。 这是另一个:如果你想删除node2怎么办?是的,您必须重命名以下所有变量。

您使用循环获得动态解决方案的想法很好。然而,创建数据的方式是这个目标的障碍。 尽量避免在程序中使用变量名作为值。

答案 1 :(得分:0)

    for (var a:int = 1; a < 4 ; a++)
    {
        if (a < 3)
        {
        this["node"+ String(a)].next = this["node"+ String(a+1)];
        }
        else
        {
            this["node"+ String(a)].next = null;
        }

    }

我使用括号语法动态访问属性(按字符串)。您可以通过在互联网上搜索来了解更多信息。