HashMap的不同用途

时间:2011-01-25 02:07:20

标签: data-structures programming-languages hashmap

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

我很清楚在某些语言中String,Int等是Objects

ActionScript示例: 存储与Object相关的值,而不更改Object的接口。

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]);
}

2 个答案:

答案 0 :(得分: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()))

答案 1 :(得分:1)

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