15

他のプログラミング言語ではint array[23][23]、各次元に 23 個の要素を持つ 2D 配列を宣言するために使用できます。Haxeで同じことを達成するにはどうすればよいですか?

現在、私はこれを行う必要があります:

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

しかし、配列のサイズが大きくなると、そのように宣言することができなくなります。

4

5 に答える 5

13

これを行う最善の方法は、Haxe 3 で提供されている配列内包表記を利用することです。

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

配列内包表記は、配列を作成するための非常に優れた凝縮された構文です。上記のコードは、0 で埋められた 10x10 の配列を作成します。詳細については、こちらをご覧ください。

なんらかの理由で Haxe 2 を実行している場合、前に提案したように、for ループでそれらを埋めるのが最善の方法です。

于 2013-05-01T22:50:24.640 に答える
8

ジョンの答えに対するコメントで考えたように、私が知っている2次元配列の組み込みはありませんが、作成するのは難しくありません。

ここでは 2 つのヘルパー関数を作成しました。1 つはhaxe.ds.Vector、Haxe 3 で新しく追加され、固定サイズのコレクション用に最適化された を使用します。もう1つは通常の配列を使用するため、一部のプラットフォームでは遅くなる可能性があり、技術的には固定幅ではなく、特定のサイズに初期化されているだけです.

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 でも正常に動作するはずです。

于 2013-05-01T13:04:40.187 に答える
6

1D 配列を使用して 2D 配列を偽造できます。

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]; 
    } 
} 
于 2013-05-01T11:54:36.033 に答える