在Haxe中使用对象作为Map键

时间:2014-12-09 01:32:01

标签: haxe

我试图以对象作为键来制作Map。问题是,当我尝试从这张地图中获取元素时,我总是得到null。这是因为我没有提供与密钥完全相同的引用。我提供的对象具有相同的,因此参考不同。

有什么方法可以解决这个问题吗?我可以使用某种equals()函数吗?

class PointInt
{
    public var x:Int;
    public var y:Int;

    ...
}
var map = new Map<PointInt, Hex>();

var a = new PointInt(1, 1);
var b = new PointInt(1, 1);

var hex_a = new Hex();

map[a] = hex_a;
var hex_b = map[b];

/// hex_b == null now because reference(a) == reference(b)

1 个答案:

答案 0 :(得分:9)

正如herehere所述,Haxe中的Map使用对象的引用作为关键字。

您想要使用的是这样的HashMaptry.haxe link):

import haxe.ds.HashMap;

class Test {
    static function main() {

        var map = new HashMap();
        map.set(new PointInt(1, 1), 1);

        trace(map.get(new PointInt(1,1)));
    }
}

class PointInt
{
    public var x:Int;
    public var y:Int;

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

    public function hashCode():Int
    {
        return x + 1000*y; //of course don't use this, but a real hashing function
    }

    public function toString()
    {
        return '($x,$y)';
    }
}

除了使用haxe.ds.HashMap代替Map之外,您需要在代码中更改的内容是在密钥对象中实现hashCode : Void->Int函数

由于您使用的是具有2个int的对象,并且哈希映射只有1个int,因此2 PointInt将具有相同的哈希码。要解决这个问题,您可以创建一个使用字符串作为哈希码的哈希映射,但如果您可以编写(或谷歌)一个好的哈希函数,您将获得更好的性能。