在ActionScript3中创建对象相等“HashMap”作为java HashMap

时间:2010-12-25 12:25:35

标签: java flex actionscript-3

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一样的数据结构

3 个答案:

答案 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了解详情。