有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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.

但我想这样使用字典:

trace(table[jonny2]) // traces: "That's me".

总之,我想实现一个类似于java中HashMap的数据结构


共 (3) 个答案

  1. # 1 楼答案

    字典允许将复杂对象用作键。正如John提到的,Dictionary不能用作hashmap,因为它使用严格的等式来检查Dictionary的键

    相比之下,对象可以用作贴图,其中键是字符串。这意味着,当您将复杂对象添加为键时,将调用objects toString()并将其用作映射中的键。在您的示例中,您可以向Person类添加一个toString()实现,该实现列出了使Person唯一的所有属性

    考虑这个toStrug()方法:

    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实例,您会看到:

    map:Object
      [Person(name:jonny, age:26)] : That's me
    

    注意:虽然这是可行的,但我不确定是否建议使用toString()方法来检查等式。我认为ToStrug()是一个调试/日志辅助工具,它可能会改变(并且破坏代码)。p>

  2. # 3 楼答案

    我不相信你可以那样使用^{}。从文件中:

    The Dictionary class lets you create a dynamic collection of properties, which uses strict equality (===) for key comparison on non-primitive object keys. When an object is used as a key, the object's identity is used to look up the object, and not the value returned from calling toString() on it.

    注意对严格相等和对象标识的引用

    我不知道是否还有另一种数据结构可以工作,但不幸的是,在对象本身中似乎没有什么可以改变Dictionary的行为

    你可能想看看开源^{}项目,尽管我无法从描述中立即判断这是否符合你的要求

    你可能还想调查一下associative arrays

    (不过,这一切都是基于一点研究——我从来没有真正做过任何动作脚本,所以还是少说一点吧。)