我试图以对象作为键来制作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)
答案 0 :(得分:9)
正如here和here所述,Haxe中的Map
使用对象的引用作为关键字。
您想要使用的是这样的HashMap
(try.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
将具有相同的哈希码。要解决这个问题,您可以创建一个使用字符串作为哈希码的哈希映射,但如果您可以编写(或谷歌)一个好的哈希函数,您将获得更好的性能。