我正在尝试用一个对象作为密钥来创建一个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)发布于 2014-12-09 02:22:41
正如解释过的这里和这里一样,Haxe中的Map使用对象的引用作为键。
您想要使用的是这样的HashMap (try.haxe链路):
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将具有相同的哈希代码。要解决这个问题,您可以创建一个使用字符串作为哈希代码的散列映射,但是如果您能够编写(或谷歌)一个好的散列函数,那么您将获得更好的性能。
https://stackoverflow.com/questions/27370043
复制相似问题