在其他编程语言中,我可以int array[23][23]
用来声明一个二维数组,每个维度有 23 个元素。如何在 Haxe 中实现相同的目标?
目前我需要这样做:
var arr:Array<Array<Int>> = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
但是当数组增长到更大的大小时,我就不能再这样声明它了。
在其他编程语言中,我可以int array[23][23]
用来声明一个二维数组,每个维度有 23 个元素。如何在 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]];
数组推导式是一种用于制作数组的非常好且简洁的语法。上面的代码将创建一个 10x10 的数组,用 0 填充。你可以在这里阅读更多关于它们的信息。
如果您出于某种原因运行 Haxe 2,最好的方法是使用 for 循环填充它们,如前所述。
正如您在对约翰回答的评论中所想的那样,我所知道的二维数组没有内置的,但创建一个并不难。
在这里,我制作了 2 个辅助函数,一个 uses 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。
您可以使用 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];
}
}
这是在 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: []
如果您不使用 haxe 3,并且您想要一个带有 null 的数组,那么最短的就是只初始化最后一个元素,其他元素将用 null 填充:
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;