首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Haxe中使用对象作为映射键

在Haxe中使用对象作为映射键
EN

Stack Overflow用户
提问于 2014-12-09 01:32:00
回答 1查看 2K关注 0票数 3

我正在尝试用一个对象作为密钥来创建一个Map。问题是,当我试图从这个映射中获取元素时,我总是得到null。这是因为我没有提供与关键完全相同的参考资料。我提供了一个具有相同值的对象,因此引用是不同的。

有什么办法解决这个问题吗?我能让它使用某种equals()函数吗?

代码语言:javascript
复制
class PointInt
{
    public var x:Int;
    public var y:Int;

    ...
}
代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 02:22:41

正如解释过的这里这里一样,Haxe中的Map使用对象的引用作为键。

您想要使用的是这样的HashMap (try.haxe链路):

代码语言:javascript
复制
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,且哈希映射仅为1int,因此,2个PointInt将具有相同的哈希代码。要解决这个问题,您可以创建一个使用字符串作为哈希代码的散列映射,但是如果您能够编写(或谷歌)一个好的散列函数,那么您将获得更好的性能。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27370043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档