多年来我一直熟悉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]);
}
答案 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关于键的相等定义是深度比较。在其他语言/库中,关于不变量,相等性,散列和不变性的固有要求是相同的,但它们并未得到强制执行。