我正在尝试做一个Map
以一个对象作为键。问题是,当我尝试从这张地图中获取元素时,我总是得到null
。这是因为我没有提供与密钥完全相同的参考。我正在提供一个具有相同的对象values,所以参考不同。
有什么办法可以解决吗?我可以让它使用某种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)
正如所解释的here https://stackoverflow.com/questions/23706464/haxe-3-map-only-retrieves-null and here https://groups.google.com/forum/#!msg/haxelang/F9Ovh7KS6rs/ENuF8qtb-GgJ, Map
在 Haxe 中,使用对象的引用作为键。
你想用的是HashMap https://api.haxe.org/haxe/ds/HashMap.html像这样 (try.haxe 链接 https://try.haxe.org/#d5D63):
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,因此会发生 2PointInt
将具有相同的哈希码。为了解决这个问题,您可以创建一个使用字符串作为哈希码的哈希映射,但如果您可以编写(或谷歌)一个好的哈希函数,您将获得更好的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)