【问题标题】:Different Uses For HashMapHashMap 的不同用途
【发布时间】:2011-01-25 02:07:20
【问题描述】:

我已经熟悉 HashMap 多年了。在 java 中,我将它们用作关联数组,在 ActionScript 中,我将它们用于一些有趣的技巧(参见下面的示例)。我需要使用 Object 作为键是非常罕见的,我想知道是否有人有有趣的例子,你使用 HashMaps 和 Object 作为键。请用您选择的语言回答,此问题与任何特定语言无关。

我很清楚,在某些语言中,String、Int 等是对象

ActionScript 示例: 在不改变对象接口的情况下存储与对象相关的值。

var s:Sprite = new Sprite();
// dictionary is like a HashMap in AS
var lookup:Dictionary = new Dictionary();
lookup[s] = someValue;
s.addEventListener(MouseEvent.CLICK, onClick);
function onClick(evt:Event):void{
  trace(lookup[evt.currentTarget]);
}

【问题讨论】:

    标签: data-structures programming-languages hashmap


    【解决方案1】:

    当我有一个复杂的键时,我通常使用值对象作为键;这类似于在具有多个列的数据库表中具有主键。例如,假设您有一门包含多个部分的大学课程。在 Java 中,你可能有一个像这样的值对象:

    class Section {
       private String courseName;
       private int sectionNumber;
       ...
    } 
    

    使用 getter、setter、equals() 和 hashCode()。您也可能在值对象上具有其他属性,但如果使用这两个属性编写 equals 和 hashCode,您可以使用 Section 作为映射键。

    我见过一些人简单地将他们想要作为键的字段连接成一个字符串,例如String key = course + Integer.toString(section);,但就我而言,使用map.put(section, students) 比使用map.put(section.getCourseName() + Integer.toString(section.getSectionNumber())) 更具表现力.

    【讨论】:

      【解决方案2】:

      这取决于键相等的定义。如果相等意味着对象身份(相同的内存地址),那么任何对象都可以。如果键相等取决于对象的内部状态,那么大多数库建议您提供一个有意义的hash() 实现。 Python 还需要知道用作键的对象是immutable,因此在将键添加到映射后,不能通过修改键来破坏不变量。 Python 对键相等的定义是深度比较的。在其他语言/库中,关于不变量、相等性、散列和不变性的内在要求是相同的,但并未强制执行。

      【讨论】:

      • +1 感谢您的反馈。有趣的是 Python 使用深度比较,我不知道。
      • @Zevan 它可以使用深度比较,因为它最多只允许已知不可变类型的元组,这些元组都是基本的并且可以有效地比较。
      猜你喜欢
      • 2020-06-12
      • 2011-02-12
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多