AS3中的2d阵列问题

时间:2011-08-22 11:08:09

标签: flash actionscript-3 multidimensional-array

我遇到了一个奇怪的问题。我试图生成一个元素值为1或0(随机填充)的矩阵。我将值存储到2D数组中。这是第一帧的代码。一切似乎都很好。

var multiArr:Array = new Array([2], [2]);


    function generateMatrixXML() {

    for(var i:uint = 0; i < 2; i++)
    {
        for(var j:uint = 0; j < 2; j++)
        {
            multiArr[i][j] = getRandomNumber(0,1);;

        }
    }
    trace(multiArr);
    }

    function getRandomNumber(lower,upper):Number {
        return Math.floor(Math.random()*(1+upper-lower))+lower;
    }


    generateMatrixXML();

当我将行和列的值更改为3时,出现错误。

var multiArr:Array = new Array([3], [3]);


function generateMatrixXML() {

for(var i:uint = 0; i < 3; i++)
{
    for(var j:uint = 0; j < 3; j++)
    {
        multiArr[i][j] = getRandomNumber(0,1);;

    }
}
trace(multiArr);
}

function getRandomNumber(lower,upper):Number {
    return Math.floor(Math.random()*(1+upper-lower))+lower;
}


generateMatrixXML();

TypeError:错误#1010:术语未定义且没有属性。     在matrixArray_fla :: MainTimeline / generateMatrixXML()     在matrixArray_fla :: MainTimeline / frame1()

知道错误的原因是什么

3 个答案:

答案 0 :(得分:3)

这一行:

var multiArr:Array = new Array([3], [3]);

创建一个包含两个数组的数组,每个数组都有一个包含数字3的元素。这意味着当你进入第三次迭代时multiArr[i]是未定义的。这显然是对如何在AS3 1

中定义数组的误解

实际上你需要在循环中创建数组:

var multiArr:Array = [];
var iterations:int = 3;

function generateMatrixXML() {
    for(var i:uint = 0; i < iterations; i++)
    {
        multiArr[i] = [];
        for(var j:uint = 0; j < iterations; j++)
        {
            multiArr[i][j] = getRandomNumber(0,1);

        }
    }
    trace(multiArr);
}

function getRandomNumber(lower,upper):Number {
    return Math.floor(Math.random()*(1+upper-lower))+lower;
}

generateMatrixXML();

脚注1: Flash编码实践要求您使用[]表示法定义新数组:

var arr1:Array = []; // create a new array
var arr2:Array = [1]; // create an array with  one element, the number 1
var arr3:Array = new Array(1); // defines a new array with a pre-set length of 1
var arr4:Array = new Array(1,2); // defines a new array with two elements, the numbers 1 and 2

最后一个例子在AS3中被认为是一种糟糕的编码习惯,因为它在第三个例子中引起了混乱。

答案 1 :(得分:3)

我知道这个问题已经有了一个公认的答案,但我认为值得注意的是,有几个不同的解决方案。虽然,是的,AS3并不天真地支持2D阵列,它确实支持阵列阵列,可用于复制其功能。

要强制初始化一个数组数组,这就是op尝试做的事情,有一种简单的方法。要制作3x3阵列,可以写:

var arr5:Array = new Array(new Array(3), new Array(3), new Array(3));

或者甚至更简单,更神秘:

var arr6:Array = [[0,0,0],[0,0,0],[0,0,0]] // Create a 3x3 array with all values set to 0

如果您要在循环中立即初始化值,您甚至可以逃脱:

var arr6:Array = [[],[],[]] // Create an empty '2D' array with 0 cols and 3 rows

现在,我不会制作像这样的10x10阵列,但它很简单,适用于较小的多维阵列。对于较大的多维数组,最好在循环中初始化,就像接受的答案一样。

但这也可能是谈论矢量的好时机。如果你正在创建一个数组并且你知道它总是会持有一个特定的类(特别是如果它总是具有特定的长度),那么你可以利用vector类。

var rows:uint = 10, cols = 10;
var multiArray:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>(rows, true);
for(var i:uint = 0; i < rows; i++) multiArray[i] = new Vector.<Number>(cols, true);

这将创建一个10x10的数字2D数组,其大小是固定的。在阵列上使用强类型向量肯定有一些好处。

第二个示例失败的原因是,与接受的答案中的注释一样,两次创建1x2数组。扩展形式是

// var multiArray:Array = new Array([3],[3])
var multiArr:Array = []
multiArray[0] = [3]
multiArray[1] = [3]

请注意multiArray[0][1]undefined。但更重要的是,multiArray [2]总是undefined。它在尝试引用multiArray[2][0]时失败,因为它不在那里。

另请注意,Flash中的Array备用数组Vector密集)。这意味着您可以执行以下操作:

var arr7:Array = [];
arr7[100] = 1;

它将位置0到99保留为undefined,只将索引100设置为1

答案 2 :(得分:1)

Creating a 2D Array

var multiDimensionalArray:Array = new Array();
var boolArray:Array;
var MAX_ROWS = 5;
var MAX_COLS = 5;

//initalize the arrays
for (var row = 0; row <= MAX_ROWS; row++)
{
    boolArray = new Array();

    for (var col = 0; col <= MAX_COLS; col++)
        boolArray.push(false);
    }

    multiDimensionalArray.push(boolArray);
}

//now we can set the values of the array as usual
for (var row = 0; row <= MAX_ROWS; row++)
{
    for (var col = 0; col <= MAX_COLS; col++)
        boolArray[row][col] = true;
        trace('boolArray ' + row + ',' + col + ' = ' + boolArray[row][col]);
    }
}