【问题标题】:Problem with 2d Array in AS3AS3中二维数组的问题
【发布时间】:2011-08-22 11:08:08
【问题描述】:

我遇到了一个奇怪的问题。我正在尝试生成一个元素值为 1 或 0(随机填充)的矩阵。我将值存储到二维数组中。这是第一帧的代码。一切似乎都运行良好。

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()

知道错误的原因是什么

【问题讨论】:

    标签: flash actionscript-3 multidimensional-array


    【解决方案1】:

    这一行:

    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 中被认为是一种不好的编码习惯,因为它与第三个示例混淆。

    【讨论】:

    • 因为在第一种情况下他只迭代了两次。第一行在 both 情况下定义了一个 2x2 矩阵。
    • 为什么是 2x2?定义的数组中只有 1 个元素?
    • 对不起,是的。在这两种情况下都是 2x1。第一个没有失败的原因是因为定义了所有必需的数组,并且在 AS3 中,只要定义了数组,您就可以定义任意数量的新索引。第二个示例失败,因为multiArr[2](第三个索引)中没有定义数组;
    • Flash 本身不支持二维数组。每个人学习 AS3 都要写 10 遍 :-)
    【解决方案2】:

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

    要蛮力初始化一个数组数组,这是操作尝试做的事情,有一种直截了当的方法。要制作一个 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 数组,但它很简单,并且适用于较小的多维数组。对于较大的多维数组,最好在循环中初始化,就像接受的答案一样。

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

    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] 时失败,因为它不存在。

    还要注意,闪存中的Array备用数组(其中Vector 类是密集的)。这意味着您可以执行以下操作:

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

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

    【讨论】:

      【解决方案3】:
      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]);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-13
        • 2018-11-15
        • 2020-01-18
        • 1970-01-01
        • 2019-08-08
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多