在Haxe中使用对象作为Map键

问题描述 投票:3回答:1

我想用一个物体作为钥匙制作一个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)
haxe
1个回答
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将具有相同的哈希码。要解决这个问题,您可以创建一个使用字符串作为哈希码的哈希映射,但如果您可以编写(或谷歌)一个好的哈希函数,您将获得更好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.