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.
但我想用这样的方式使用Dictionary:
trace(table[jonny2]) // traces: "That's me".
总之,我希望实现一个像java中的HashMap一样的数据结构
答案 0 :(得分:3)
我不相信你可以这样使用Dictionary
。来自文档:
Dictionary类允许您创建动态的属性集合,它使用严格相等(===)对非基本对象键进行键比较。当一个对象用作键时,该对象的标识用于查找该对象,而不是从其上调用toString()返回的值。
请注意对严格相等和对象标识的引用。
我不知道是否还有另一个 工作的数据结构,但遗憾的是,在对象本身中你无法改变Dictionary
的行为。
您可能希望查看开源HashTable
项目,但我无法立即从描述中看出这是否符合您的要求。
您可能还想查看associative arrays。
(这只是基于一些研究 - 我从来没有真正完成任何ActionScript,所以用一点盐就可以了。)
答案 1 :(得分:2)
字典允许将复杂对象用作键。正如John所提到的,Dictionary不能用作散列映射,因为它使用严格相等来检查字典的键。
相反,对象可以用作地图,其中键是字符串。这意味着当您将复杂对象添加为键时,将调用toString()对象并将其用作映射中的键。在您的示例中,您可以向Person类添加一个toString()实现,该类列出了(一起)使一个人唯一的所有属性。
考虑这个toString()方法:
public function toString():String {
return "[Person(name:" + name + ", age=" + age + ")]";
}
如果您将运行以下测试,它将通过:
public function testMap():void {
var jonny1:Person = new Person("jonny", 26);
var jonny2:Person = new Person("jonny", 26);
var map:Object = {};
map[jonny1] = "That's me";
assertEquals("That's me", map[jonny2]); // succeeds
}
如果您使用调试器查看地图实例,您会看到:
map:Object
[Person(name:jonny, age:26)] : That's me
注意:虽然这有效,但我不确定是否建议依赖toString()方法来检查是否相等。我会认为toString()是一个调试/日志记录辅助工具,它可能会改变(并破坏你的代码)。
答案 2 :(得分:1)
我编写了一个名为 as3-collections 的集合框架,它可以让您更好地控制对象相等性和对象散列。查看https://github.com/danschultz/as3-collections了解详情。