如何在Haxe中声明2D数组?

15
在其他编程语言中,我可以使用int array[23][23]来声明一个有23个元素的二维数组。在Haxe中我应该怎么做才能达到同样的效果?
目前我需要这样做:
var arr:Array<Array<Int>> = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
但当数组增长到较大的大小时,我不再能像那样声明它,这变得不可行了。

你可能想要将其中一个答案标记为已接受的吗? - Gama11
5个回答

13

最好的方法是利用Haxe 3中提供的数组推导式:

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

数组推导式是一种非常简洁的语法,用于创建数组。上面的代码将创建一个10x10的数组,并填充为0。如果您想了解更多信息,请单击这里

如果由于某些原因您正在使用Haxe 2,则最好的方法是像以前建议的那样使用for循环来填充它们。


8

正如你在John的答案评论中所指出的那样,我不知道是否有内置的2d数组,但是创建一个并不难。

这里我创建了两个帮助函数,其中一个使用了Haxe 3中新引入的haxe.ds.Vector,它针对固定大小的集合进行了优化。另一个使用普通的数组,在某些平台上可能会更慢,技术上来说也不是固定宽度,只是初始化为一定的大小。

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;
    }
}
只能在Haxe 3上使用(本月稍后发布),也应该可以在Haxe 2上正常工作。

6
您可以使用一维数组来“伪造”二维数组:
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]; 
    } 
} 

等一下,我完全对Haxe是个新手,你的意思是说在Haxe中没有简单的2D数组初始化吗?这很有趣。 - sub_o
没有.. 确实没有。你在原始帖子中展示的方式就是应该的,但是有很多辅助函数可以为您简化它。(请参见Jason的回答) - John Willemse
2
Haxe中基本类型无法扩展,这是行不通的。无论如何,您还需要提供一个参数。 - Cristi Băluță

2

这是在Axe(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: []

(注:该文本已被翻译为中文,不需要再次翻译)

2

如果您没有使用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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接