我遇到了一个奇怪的问题。我试图生成一个元素值为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()
知道错误的原因是什么
答案 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]);
}
}