在ActionScript 3中使用Object Equality创建"真正的"HashMap实现

Jon*_*ves 5 collections hash actionscript-3

我一直在花费一些业余时间为ActionScript 3开发一组集合,但是由于ActionScript 3在Dictionary Objects中处理相等性检查的方式,我遇到了一个非常严重的障碍.

当您比较字典中的键时,ActionScript使用===运算符来执行比较,这会产生一些令人讨厌的副作用,即只有对同一实例的引用才会解析为true而不是相等的对象.这就是我的意思:

const jonny1 : Person = new Person("jonny", 26);
const jonny2 : Person = new Person("jonny", 26);

const table : Dictionary = new Dictionary();
table[jonny1] = "That's me";

trace(table[jonny1]) // traces: "That's me"
trace(table[jonny2]) // traces: undefined. 
Run Code Online (Sandbox Code Playgroud)

我试图解决这个问题的方法是提供一个Equalizer接口,如下所示:

public interface Equalizer 
{
    function equals(object : Object) : Boolean;
}
Run Code Online (Sandbox Code Playgroud)

这允许执行instanceOf-esq.每当我需要在我的集合中执行相等操作时检查(当对象没有实现Equalizer时,返回到===运算符); 然而,这并没有解决我的基础数据结构(字典对象)不知道这一点的事实.

我目前解决这个问题的方法是迭代遍历字典中的所有键,并在执行containsKey()或get()操作时执行相等性检查 - 但是,这几乎击败了hashmap的整个点(便宜的查询操作).

如果我无法继续使用Dictionary实例作为map的支持,我将如何为作为键传入的唯一对象实例创建哈希,以便我仍然可以保持相等?

A. *_*evy 1

在插入对象时计算对象的哈希码,然后通过支持字典中的哈希码查找它们怎么样?哈希码应该比较 === 就可以了。当然,这需要您为对象类型提供 Hashable 接口,而不是 Equalizer 接口,因此这并不比您已经做的工作​​少多少,但您确实获得了廉价的查找。