我的代码如下所示:
private void MethodToDo(SpecialObject o) {
Map<InfoObj, Integer> totalNeeds = new HashMap<InfoObj, Integer>();
for (ListObject obj : o.getListOfObjects()) {
InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());
Integer need = totalNeeds.get(infoObj);
if (need == null) {
need = new Integer(obj.getNeeded());
} else {
need = need + obj.getNeeded();
}
totalNeeds.put(infoObj, need);
}
}
该对象是一个私有内部类(与该方法在同一个类中),如下所示:
private class InfoObj {
private String title;
private Integer id;
public InfoObj(String title, Integer id) {
this.title = title;
this.id = id;
}
public String getTitle() {
return title;
}
public Integer getId() {
return id;
}
@Override
public boolean equals(Object io2) {
if (this == io2) { return true; }
if ( !(io2 instanceof InfoObj) ) { return false; }
InfoObj temp = (InfoObj) io2;
return this.id.equals(temp.id) && this.title.equals(temp.title);
}
@Override
public int hashCode() {
final int prime = 7;
int result = 1;
result = prime * result
+ ((this.title == null) ? 0 : this.title.hashCode());
result = prime * result
+ ((this.id == null) ? 0 : this.id.hashCode());
return result;
}
然而,尽管覆盖了equals和hashCode方法,hashMap仍将包含重复键(因为title和id是等效的......但仍然显示在多个位置)。我想我正在做的一切都正确,但意识到我可能会遗漏一些东西......
另外,我知道有重复键,因为我遍历keySet并输出结果,这导致具有相同标题和id的对象多次显示。
答案 0 :(得分:0)
看起来这里的一切都很好。
答案 1 :(得分:0)
根据您的评论,HashMap不能包含与实现相同密钥的相同密钥:
(e.hash == hash && ((k = e.key) == key || key.equals(k)))
由于您正在遵循equals和hashcode的合约,因此您在此处创建了任何对象:
InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId());
使用相同的ID和标题,将被视为相同的key
,如果地图以前包含该键的映射,则替换旧值。