【问题标题】:How to declare 2D arrays in Haxe?如何在 Haxe 中声明二维数组?
【发布时间】:2013-05-01 11:47:31
【问题描述】:

在其他编程语言中,我可以使用int array[23][23] 来声明一个二维数组,每个维度包含 23 个元素。如何在 Haxe 中实现相同的目标?

目前我需要这样做:

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

但是当数组增长到更大的大小时,我就不能再这样声明它了。

【问题讨论】:

  • 您可能想将其中一个答案标记为已接受?

标签: haxe


【解决方案1】:

最好的方法是利用 Haxe 3 中提供的数组解析:

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

数组推导是一种非常好的和简洁的创建数组的语法。上面的代码将创建一个 10x10 的数组,用 0 填充。你可以阅读更多关于他们的信息here

如果您出于某种原因运行 Haxe 2,最好的方法是使用 for 循环填充它们,如前所述。

【讨论】:

    【解决方案2】:

    正如您在对 John 的回答的评论中发现的那样,据我所知,没有内置的二维数组,但创建一个并不难。

    这里我制作了 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】:

      您可以使用一维数组伪造二维数组:

      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 中没有简单的二维数组初始化?这很有趣
      • 不.. 真的没有。您在 OP 中向我们展示的方式是应该如何完成,但是有许多辅助函数可以为您简化它。 (见杰森的回答)
      • 基本类型不能在 Haxe 中扩展,这是行不通的。无论如何,您也需要提供一个参数。
      【解决方案4】:

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

      【讨论】:

        【解决方案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: []

        【讨论】:

          猜你喜欢
          • 2013-05-05
          • 1970-01-01
          • 2022-01-15
          • 2010-12-21
          • 2012-02-27
          • 2012-04-01
          • 2020-08-01
          • 2018-06-29
          • 1970-01-01
          相关资源
          最近更新 更多