【发布时间】:2019-06-02 08:46:42
【问题描述】:
我有一个类 PointDensity 实现为:
import java.sql.Date;
public class PointDensity {
private int id_place;
private String algorithm;
private Date mission_date;
private int mission_hour;
private int x;
private int y;
public PointDensity(int id_place, String algorithm, Date mission_date, int mission_hour, int x, int y) {
this.id_place = id_place;
this.algorithm = algorithm;
this.mission_date = mission_date;
this.mission_hour = mission_hour;
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj){
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PointDensity other = (PointDensity) obj;
return id_place == other.id_place
&& algorithm.equals(other.algorithm)
&& mission_date.equals(other.mission_date)
&& mission_hour == other.mission_hour
&& x == other.x
&& y== other.y;
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + y;
result = prime * result + ((algorithm == null) ? 0 : algorithm.hashCode());
result = prime * result + x;
result = prime * result + ((mission_date == null) ? 0 : mission_date.toString().hashCode());
result = prime * result + mission_hour;
result = prime * result + id_place;
return result;
}
}
我读了一些东西并从数据库中获取值。然后我想使用 HashMap() 来将 PointDensity 对象存储为键,并将其遇到的时间存储为值。但是,它永远不会发现对象是相同的。
Map<PointDensity, Integer> pointDensities = new HashMap<>();
while (resultSet.next()){
PointDensity pointDensity =
new PointDensity(
resultSet.getInt(1),
resultSet.getString(2),
new Date(timestampValues.getLong(i)),
new java.util.Date(timestampValues.getLong(i)).getHours(),
xValues.getInt(i),
yValues.getInt(i)
);
if (pointDensities.containsKey(pointDensity)){
//IT NEVER ENTERS HERE!!!
System.out.println("exists");
int times = pointDensities.get(pointDensity);
pointDensities.replace(pointDensity, times++);
}else{
pointDensities.put(pointDensity, 1);
}
}
提前致谢:)
【问题讨论】:
-
如果有错误,既不是在
equals也不是在hashCode,这似乎是正确实现的。问题一定出在从数据库读取数据的代码中,我发现您多次读取同一列很可疑。i变量是什么? -
可能与您的问题无关,但
pointDensities.replace(pointDensity, times++);什么也不做。与...replace(..., times)相同。你的意思可能是times+1。 -
我和 Federico 在一起,当我尝试时,代码对我有用。错误一定出在您没有向我们展示的代码中,或者出在数据库数据中。
-
顺便说一句:您的
hashCode方法检查引用字段中的空值,但equals 方法不允许它们(因为您取消引用例如algorithm.equals)。您应该使它们保持一致。 -
我也怀疑你在
hashCode中使用Date.toString().hashCode(),在equals中使用Date.equals。虽然人们可能期望使用这些进行比较是相同的,但它们可能不是吗?此外,您似乎正在使用已弃用的Date.getHours()方法 - 由于时区不同,这很容易出错。
标签: java dictionary data-structures hashmap hashcode