Dictionary Haxe映射仅检索'null'`

Dictionary Haxe映射仅检索'null'`,dictionary,multidimensional-array,haxe,Dictionary,Multidimensional Array,Haxe,我在Haxe中使用地图时遇到问题。我正在尝试创建一个平铺对象的网格,并使用网格上的索引作为键将它们添加到地图中。但是,当我尝试使用索引从地图检索分幅时,我总是得到null的值 有人能解释为什么会这样吗?我以前从未使用过地图,我不明白问题出在哪里。我目前正在使用多维数组来获得相同的功能,但映射似乎更方便 private function initTiles():Void { var tempTile:Tile; tileMap = new Map(); for (i in

我在Haxe中使用地图时遇到问题。我正在尝试创建一个平铺对象的网格,并使用网格上的索引作为键将它们添加到地图中。但是,当我尝试使用索引从地图检索分幅时,我总是得到
null
的值

有人能解释为什么会这样吗?我以前从未使用过地图,我不明白问题出在哪里。我目前正在使用多维数组来获得相同的功能,但映射似乎更方便

private function initTiles():Void
{
    var tempTile:Tile;
    tileMap = new Map();

    for (i in 0...widthTiles)
    {
        for (j in 0...heightTiles)
        {
            tempTile = new Tile(i * 32, j * 32);
            tileMap.set([i,j],tempTile);
        }
    }
}

问题在于,实际上您并不是在创建多维数组,而是在创建一个一维数组,其中键类型为
数组
。如果有疑问,您可以使用
$type(tileMap)
让编译器告诉您它认为您拥有的类型

在您的情况下,您将获得:

Map<Array<Int>,Tile>; // This is an ObjectMap, where the object is an Array
基本上,在Haxe中,对象(包括数组)的相等性取决于它们是否是完全相同的对象,而不是它们是否具有相同的值。在本例中,您将比较两个不同的阵列。尽管它们具有相同的值,但它们实际上是两个不同的对象,并且不相等。因此,他们不会为您的地图制作合适的键

以下是您需要做的工作示例:

class Test {
    static function main() {
        initTiles();
        trace( tileMap[3][6] );
    }

    static var tileMap:Map<Int,Map<Int,Tile>>;
    static function initTiles():Void {
        var widthTiles = 10;
        var heightTiles = 10;
        tileMap = new Map();
        for (i in 0...widthTiles) {
            if ( tileMap[i]==null ) {
                // Add the sub-map for this column
                tileMap[i] = new Map();
            }
            for (j in 0...heightTiles) {
                // Add the tile for this column & row
                tileMap[i][j] = new Tile(i*32, j*32);
            }
        }
    }
}

class Tile {
    var x:Int;
    var y:Int;
    public function new(x:Int, y:Int) {
        this.x = x;
        this.y = y;
    }
}
类测试{
静态函数main(){
initTiles();
微量元素(tileMap[3][6]);
}
静态变量tileMap:Map;
静态函数initTiles():Void{
var=10;
var heightTiles=10;
tileMap=新映射();
用于(0…宽度瓷砖中的i){
if(tileMap[i]==null){
//添加此列的子映射
tileMap[i]=新映射();
}
适用于(0英寸j…高度){
//添加此列和行的平铺(&W)
tileMap[i][j]=新瓷砖(i*32,j*32);
}
}
}
}
类瓷砖{
var x:Int;
变量y:Int;
新公共函数(x:Int,y:Int){
这个.x=x;
这个。y=y;
}
}
要查看它的运行:(打开浏览器控制台查看跟踪)。

可能重复的
trace( [0,0] == [0,0] ); // False!
class Test {
    static function main() {
        initTiles();
        trace( tileMap[3][6] );
    }

    static var tileMap:Map<Int,Map<Int,Tile>>;
    static function initTiles():Void {
        var widthTiles = 10;
        var heightTiles = 10;
        tileMap = new Map();
        for (i in 0...widthTiles) {
            if ( tileMap[i]==null ) {
                // Add the sub-map for this column
                tileMap[i] = new Map();
            }
            for (j in 0...heightTiles) {
                // Add the tile for this column & row
                tileMap[i][j] = new Tile(i*32, j*32);
            }
        }
    }
}

class Tile {
    var x:Int;
    var y:Int;
    public function new(x:Int, y:Int) {
        this.x = x;
        this.y = y;
    }
}