他のプログラミング言語ではint array[23][23]
、各次元に 23 個の要素を持つ 2D 配列を宣言するために使用できます。Haxeで同じことを達成するにはどうすればよいですか?
現在、私はこれを行う必要があります:
var arr:Array<Array<Int>> = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
しかし、配列のサイズが大きくなると、そのように宣言することができなくなります。
他のプログラミング言語ではint array[23][23]
、各次元に 23 個の要素を持つ 2D 配列を宣言するために使用できます。Haxeで同じことを達成するにはどうすればよいですか?
現在、私はこれを行う必要があります:
var arr:Array<Array<Int>> = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
しかし、配列のサイズが大きくなると、そのように宣言することができなくなります。
これを行う最善の方法は、Haxe 3 で提供されている配列内包表記を利用することです。
var bigArray:Array<Array<Int>> = [for (x in 0...10) [for (y in 0...10) 0]];
配列内包表記は、配列を作成するための非常に優れた凝縮された構文です。上記のコードは、0 で埋められた 10x10 の配列を作成します。詳細については、こちらをご覧ください。
なんらかの理由で Haxe 2 を実行している場合、前に提案したように、for ループでそれらを埋めるのが最善の方法です。
ジョンの答えに対するコメントで考えたように、私が知っている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 でも正常に動作するはずです。
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];
}
}