根据对象的内容创建唯一ID

时间:2014-06-17 17:45:56

标签: java matrix

我想知道在java中是否可以为对象内的元素创建一个ID,所以如果使用相同的元素生成另一个对象,我可以检查它是否是私密创建的。

示例1 `

{

    int[][] cha = new int[3][3];
    cha[0][0] = 8;
    cha[0][1] = 1;
    cha[0][2] = 3;
    cha[1][0] = 4;
    cha[1][1] = 0;
    cha[1][2] = 2;
    cha[2][0] = 7;
    cha[2][1] = 6;
    cha[2][2] = 5;

    int[][] hol = new int[3][3];
    hol[0][0] = 8;
    hol[0][1] = 1;
    hol[0][2] = 3;
    hol[1][0] = 4;
    hol[1][1] = 0;
    hol[1][2] = 2;
    hol[2][0] = 7;
    hol[2][1] = 6;
    hol[2][2] = 5;


    HashSet<int[][]> k = new HashSet();
    k.add(cha);

    System.out.println(k.contains(cha));
    System.out.println(k.contains(hol));


}`

在这种情况下,我会得到值&#34; true,false&#34;即使两个矩阵都是相同的(我知道这是因为HashSet引用了内存地址而不是对象。)

我希望能够第二次创建矩阵并确定它是否已经创建。

感谢。

2 个答案:

答案 0 :(得分:0)

将其包装在课堂中并定义您自己的equals()hashcode()

答案 1 :(得分:0)

  

我知道这是因为HashSet引用了内存地址而不是对象

不,那不是原因。原因是数组只与自身相等,因为数组不会覆盖{HAPSet用于检查已包含哪些元素的Object.equals()Object.hashCode()方法。

要获得所需的行为,您需要将矩阵包装到您自己的类中,该类重写equals()和hashCode(),以便判断两个矩阵何时相等。确保在矩阵存储到HashSet中之后永远不要修改它的任何元素:

public final class Matrix {
    private int[][] elements;

    public Matrix(int[][] elements) {
        this.elements = elements; 
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Matrix)) {
            return false;
        }
        Matrix m = (Matrix) o;
        return Arrays.deepEquals(this.elements, m.elements);
    }

    @Override
    public int hashCode() {
        return Arrays.deepHashCode(elements);
    }
}

现在你可以做到

HashSet<Matrix> set = new HashSet<>();

Matrix m1 = new Matrix(cha);
k.add(m1);

System.out.println(set.contains(m1));

Matrix m2 = new Matrix(hol);
System.out.println(set.contains(m2));