[英]Create an unique ID based on the content of the object
我想知道是否有可能在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));
}`
在这种情况下,即使两个矩阵都相同,我也将获得值“ true,false”(我知道这是因为HashSet确实引用了内存地址而不是对象)。
我希望能够再次创建矩阵,并确定是否已经创建矩阵。
谢谢。
将其包装在类中,并定义自己的equals()
和hashcode()
我知道这是因为HashSet确实引用了内存地址而不是对象
不,那不是原因。 原因是数组仅等于其自身,因为数组不会覆盖Object.equals()
和Object.hashCode()
方法,而HashSet会使用该方法检查其已包含的元素。
为了获得所需的行为,您需要将矩阵包装到自己的类中,该类重写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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.