使用新的但相同值键的对象键进行Haxe地图访问

时间:2017-02-05 19:01:34

标签: hashmap equality haxe

标题有点令人困惑。但让我解释一下我的问题。

让我们假装有一个名为MyObj的班级。此MyObj具有hashCode()函数,该函数生成Int哈希码,以便将Haxe地图用作关键字。像这样:

var mymap = new Map<MyObj,String>();
var myobj = new MyObj(my,params);
mymap[myobj] = "whatever";
trace(mymap[myobj]); // works great and can print "whatever" from map

以上作品很棒。然而;当映射到具有相同参数的新对象时,它不起作用。

trace(mymap[new MyObj(my,params)]); // does not work, returns null

当打印出来并检查整个地图(trace(mymap))时,似乎每个&#34; new&#34;用作密钥的对象实际上是一个新的&#34; id&#34;或&#34;哈希码&#34; (Haxe在幕后做了什么)。

我甚至在MyObj中重载了equals运算符(可以是抽象类型)。

问题是,如何使用包含相同值的不同对象从地图中检索元素,如上所述。

如何做这样的工作:

mymap[new MyObj(my,params)]

3 个答案:

答案 0 :(得分:3)

提供@theRemix答案的替代方案:您可能需要考虑使用polygonal-ds库。它通过HashTableHashable界面支持您所追求的内容。这是一个简单的用法示例:

import de.polygonal.ds.HashTable;
import de.polygonal.ds.Hashable;

class Main {
    public static function main() {
        var table = new HashTable<MyObj, String>(16);
        table.set(new MyObj(5), "FirstObject");
        table.set(new MyObj(2), "SecondObject");

        trace(table.get(new MyObj(5))); // "FirstObject"
        trace(table.get(new MyObj(0))); // null
    }
}

class MyObj implements Hashable {
    public var key(default, null):Int;

    public function new(key:Int) {
        this.key = key;
    }
}

有一个缺点:HashTable是一个类,而不是一个抽象,所以它不支持数组访问。

答案 1 :(得分:1)

您是否需要使用haxe.ds.HashMap代替MaphashCode工作?

答案 2 :(得分:1)

由于它们是单独的单个对象,因此需要此行为。 为了达到理想的行为,你可以

在定义访问者时,在Map<MyObj,String>内部创建一个新的抽象类型,Map<String,String>,序列化和反序列化对象键。