Подтвердить что ты не робот

Как объявить 2D-массивы в Haxe?

В других языках программирования я могу использовать int array[23][23] для объявления двумерного массива с 23 элементами в каждом измерении. Как мне добиться того же в Haxe?

В настоящее время мне нужно сделать это:

var arr:Array<Array<Int>> = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];

Но когда массив увеличивается до большего размера, для меня становится невозможным объявить его таким образом.

4b9b3361

Ответ 1

Лучший способ сделать это - воспользоваться преимуществами понимания массива, представленного в Haxe 3:

var bigArray:Array<Array<Int>> = [for (x in 0...10) [for (y in 0...10) 0]];

Понимания массивов - это действительно хороший и сжатый синтаксис для создания массивов. Приведенный выше код создаст массив 10х10, заполненный нулями. Вы можете прочитать больше о них здесь.

Если по какой-то причине вы используете Haxe 2, лучший способ сделать это - заполнить их циклами for, как предлагалось ранее.

Ответ 2

Как вы поняли в комментарии к Джону, нет встроенного для 2d массивов, о которых я знаю, но создать его не сложно.

Здесь я сделал 2 вспомогательные функции, один использует haxe.ds.Vector, который является новым в Haxe 3 и оптимизирован для коллекций фиксированного размера. Другой использует обычные массивы, поэтому на некоторых платформах может быть медленнее, и технически это не фиксированная ширина, просто инициализированная до определенного размера.

import haxe.ds.Vector;

class Vector2DTest
{
    static function main()
    {
        // 2D vector, fixed size, sometimes faster
        var v2d = Vector2D.create(3,5);

        v2d[0][0] = "Top Left";
        v2d[2][4] = "Bottom Right";

        trace (v2d);
        // [[Top Left,null,null,null,null],[null,null,null,null,null],[null,null,null,null,Bottom Right]]

        // 2D array, technically variable size, but you'll have to initialise them. Sometimes slower.
        var a2d = Array2D.create(3,5);

        a2d[0][0] = "Top Left";
        a2d[2][4] = "Bottom Right";

        trace (a2d);
        // [[Top Left,null,null,null,null],[null,null,null,null,null],[null,null,null,null,Bottom Right]]
    }
}

class Vector2D
{
    public static function create(w:Int, h:Int)
    {
        var v = new Vector(w);
        for (i in 0...w)
        {
            v[i] = new Vector(h);
        }
        return v;
    }
}
class Array2D
{
    public static function create(w:Int, h:Int)
    {
        var a = [];
        for (x in 0...w)
        {
            a[x] = [];
            for (y in 0...h)
            {
                a[x][y] = null;
            }
        }
        return a;
    }
}

Vector2D будет работать только на Haxe 3 (выпущен позже в этом месяце), Array2D также отлично работает и с Haxe 2.

Ответ 3

Вы можете подделать 2D-массив с помощью массива 1D:

class Array2 extends Array 
{ 
    public var pitch(default, null): Int; 
    public function new(x: Int, y: Int) 
    { 
        pitch = x; 
        super(x * y); 
    } 

    public function get(x: Int, y: Int) 
    { 
        return this[y * pitch + x]; 
    } 
} 

Ответ 4

Если вы не используете haxe 3, и вам нужен массив с нулями, самым коротким будет инициализировать только последний элемент, остальные будут заполнены нулем:

var arr2d = new Array<Array<AType>>();
for (i in 0...10) { arr2d[i] = []; arr2d[i][10] = null; }

или как это для инициализации со значением:

for (i in 0...10) for (j in 0...10) arr2d[i][j] = a_value;

Ответ 5

это простой способ объявить массив в ax (3.0)

 class Prova
 {
   static function main ( )
   {
     var arr : Array< Array<Int> > = [  [],[],[]   ] ;

     arr[0][0] = 10 ;
     arr[0][1] = 11 ;

     trace ( arr[0] );
     trace ( arr[1] ) ;
     trace ( arr[2] ) ;
     return 0 ;
   }
 }

вывод:

Prova.hx: 12: [10,11]

Prova.hx: 13: []

Prova.hx: 14: []