我需要基于15x15矩阵值创建一个ID
,并且由于无法创建大小为15的整数,我尝试了以下理由来创建类型为{{的ID
1}}:
首先,我用单元格的值创建一个double
,并且在执行此操作的同时,我寻找具有值String
的单元格。当我发现我输入点“。”在0
中。然后,我将String
转换为String
,并将其称为BigDecilmal
的方法。
doubleValue ()
我检查了一下,生成的ID是唯一的。
基于此,我尝试如下实现 public double generateId() {
String sid = "";
for (int i = 0; i < this.matrix[0].length; i++) {
for (int j = 0; j < matrix[1].length; j++) {
if (matrix[i][j].equals("0")) {
sid += ".";
} else {
sid += matrix[i][j];
}
}
}
System.out.println("ID: " + new BigDecimal(sid).doubleValue());
return new BigDecimal(sid).doubleValue();
}
:
HashCode()
但是我的HashSet继续使用重复的值:( 有没有人建议如何做?
~~>编辑
状态类:
@Override
public int hashCode() {
long bits = doubleToLongBits(id);
int hash = (int) (bits ^ (bits >>> 32));
System.out.println("hash: " + hash);
return hash;
}
答案 0 :(得分:2)
您的问题出在equals方法中,
您必须删除最后一部分:
&& ((State) other).getId() == this.getId();
您正在检查布尔值是否具有相同的引用,但是它们不需要引用相等,那么值相等就足够了
答案 1 :(得分:-1)
我建议使用Arrays
类的内置方法来生成hashCode并测试是否相等:
@Override
public int hashCode() {
return Arrays.deepHashCode(matrix);
}
@Override
public boolean equals(Object other) {
if ((other == null) || !(other instanceof State)) {
return false;
}
State s = (State)other;
return Arrays.deepEquals(matrix, s.matrix);
}