Java HashSet允许重复

时间:2018-10-13 16:22:05

标签: java hashset

我需要基于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;
}

2 个答案:

答案 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);
}