У меня есть код, который выглядит следующим образом:
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 будет по-прежнему содержать ключи повторения (как в заголовке и id, эквивалентны ... но все равно отображаются в нескольких местах). Я думаю, что все делаю правильно, но понимаю, что могу что-то упустить ...
Кроме того, я знаю, что есть ключи повторения, потому что я перебираю набор ключей и выводю результаты, в результате чего объекты с одинаковым заголовком и идентификатором появляются несколько раз.