我正在基于每个对象中存在的一些相等属性来对给定对象进行聚合。
final Map<JBlockedPerGT, JBlockedPerGT> ret = new HashMap<JBlockedPerGT, JBlockedPerGT>();
while (allRows.hasNext()) {
final JBlockedPerGT blockedPerGT = allRows.next();
JBlockedPerGT updated = null;
if (ret.containsKey(blockedPerGT)) {
JBlockedPerGT current = ret.get(blockedPerGT);
updated = current.add(blockedPerGT);
} else {
updated = blockedPerGT;
}
ret.put(updated, updated);
}
return ret.values().iterator();
它永远不会进入if
条件,并且没有发生任何聚合,并且每个聚合都被视为不同的对象。问题是,我没有正确理解它是如何工作的。我的JBlockedPerGT
实现了hashcode和equals方法。
任何人都可以帮助我ret.containsKey(blockedPerGT)
。
我的hashcode和equals方法是
public int hashCode() {
int result = 1;
result = PRIME * result + ((gt == null) ? 0 : gt.hashCode());
result = PRIME * result
+ ((messageType == null) ? 0 : Type.hashCode());
result = PRIME * result
+ ((country == null) ? 0 : country.hashCode());
result = PRIME * result
+ ((network == null) ? 0 : network.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
JBlockedPerGTImpl other = (JBlockedPerGTImpl) obj;
if (gt == null) {
if (other.gt != null)
return false;
} else if (!gt.equals(other.gt))
return false;
if (messageType != other.messageType)
return false;
if (country == null) {
if (other.country != null)
return false;
} else if (!country.equals(other.country))
return false;
if (network == null) {
if (other.network != null)
return false;
} else if (!network.equals(other.network))
return false;
return true;
}
}
由于
答案 0 :(得分:2)
您的JBlockedPerGT
课程可能不符合hashCode
/ equals
合同。
覆盖hashCode
的{{1}}方法允许哈希集合推断对象相等。
您正在使用Object
将HashMap
作为密钥存储,JBlockedPerGT
被正确覆盖至关重要(因此,JBlockedPerGT#hashCode()
应该是equals
也被覆盖了)。
请参阅API。
修改强>
由于你确实有一些equals
/ hashCode
实现,我会仔细检查你正在比较/散列的字段以及它们在相等性测试中的真实相关性(即如果不管你怎么做)从持久性检索不错误地或有意地填充其中一个字段?)。
我还会使用调试器并分析检索到的JBlockedPerGT
个对象的内部。
答案 1 :(得分:0)
在将JBlockedPerGT
对象用作地图中的键后,您很可能会更改哈希生成属性或等同确定属性。
最好将地图密钥对象实现为不可变的。否则你会遇到这样的情况,你无法在地图中找到一个密钥,因为它的“身份”随后发生了变化。