Создание большого 2D-массива и заполнение его в AS3 - PullRequest
4 голосов
/ 12 октября 2009

Мне было интересно, есть ли лучший способ создать большой 2D-массив и заполнить его одним элементом с помощью AS3? Это быстрый пример того, что я сейчас делаю:

private var array:Array = [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]];

Но должен быть более функциональный способ! Заранее спасибо.

Ответы [ 4 ]

11 голосов
/ 12 октября 2009

Разве вы не можете просто использовать «традиционный» цикл для его заполнения? Что-то простое, как

var numCols:uint = 10,
    numRows:uint = 10,
    fillValue:uint = 1,
    array:Array = new Array(),
    i:uint,
    j: uint;

for (i = 0; i < numRows; i++) {
  array.push(new Array());
  for (j = 0; j < numCols; j++) {
    array[i].push(fillValue);
  }
}
3 голосов
/ 13 октября 2009

Я всегда использую один размерный массив и пишу свои собственные функции get / set, чтобы определить местоположение в массиве для точки (x, y):

Т.е., получение элемента:

return array[x+(y*_width)];

Чтобы сбросить массив или установить его (после того, как он был выделен)

for(var i:uint=0;i<array.length;i++)
    array[i] = 1;

Основные моменты:

  • Вам нужно выделить только один массив
  • Вы можете очень быстро сбросить, установить или скопировать элементы
  • Я предполагаю, что флэш-память использует "меньше" памяти, или в целом меньше служебных данных, поскольку существует только один массив

Один минус - убедиться, что функции доступа и сеттера выполняют проверку диапазона, поскольку ваши результаты могут «работать», но не быть точными. (Т.е. если x больше ширины, но все еще в пределах массива)

Я «вырос» на C (язык :-p), так что это всегда кажется логичным способом ведения дел; Выделите блок памяти и разделите его, как вы хотите.

1 голос
/ 13 октября 2009

правильный ответ предоставлен kkyy ... хотя я бы сказал классически, вам лучше использовать i < numCols и j < numRows, так что доступ array[column][row] ...

также, для большей производительности:

var numCols:uint = 10,
    numRows:uint = 10,
    fillValue:uint = 1,
    array:Array = new Array(),
    columnProto:Array = new Array(),
    i:uint;

for (i = 0; i < numRows; i++)
    columnProto.push(fillValue);
for (i = 0; i < numCols; i++)
    array.push(columnProto.slice());

приводит к гораздо меньшему количеству инструкций ... но вы заметите разницу только тогда, когда numCols * numRows значительно больше ...

0 голосов
/ 30 мая 2012
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();
    enter code here
    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]);
    }
}

I hope this will b usefull for u.,...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...