我正在尝试在我的班级中实现equals方法..
注意:'_data
'属性是一个double[][]
数组,我试图比较两个对象。
无论如何它编译和一切,但我总是得到一个错误的答案,这不可能是因为两个数组是相同的:o
我做错了什么?有没有其他简单的方法? (仅使用来自对象类的等号!!)
我的代码(JAVA):
public boolean equals(Object obj) {
if (!(obj instanceof MyClass)) {
return false;
}
MyClass myObj = (MyClass) obj;
return this._data.equals(myObj._data);
}
答案 0 :(得分:8)
使用
Arrays.deepEquals(this._data, myObj._data)
对阵列进行测试。
答案 1 :(得分:5)
使用Arrays.deepEquals(data, myObj._data)
答案 2 :(得分:2)
您可以查看介绍deepEquals
方法的帖子:Java Arrays.equals() returns false for two dimensional arrays
答案 3 :(得分:0)
我会覆盖你的MyClass类中的equals方法。
@Override
public boolean equals(Object obj) {//if you insist in using an Object as argument instead of double[][]
if (!(obj instanceof MyClass)) {
return false;
}
MyClass myObj = (MyClass) obj;
if(_data.length == myObj._data.length){
for(int i=0; i<_data.length; i++){
if(_data[i].length == myObj._data[i].length){
for(int j=0; j<_data[i].length; j++){
if(_data[i][j] != myObj._data[i][j]){
return false;
}
}
}else{
return false;
}
}
}else{
return false;
}
return true;
}
此代码考虑您将具有二维数组但不是方形矩阵的情况。即第一行有三个元素,第二行有27个元素,第三行有N个元素...... 例如,测试用例:
double[][] first= new double[5][3];
double[][] second= new double[5][3];
for(int i=0; i<first.length; i++){
for(int j=0; j<first[i].length; j++){
first[i][j] = 5;
}
}
for(int i=0; i<second.length; i++){
for(int j=0; j<second[i].length; j++){
second[i][j] = 5;
}
}
second[4][2] = 2;
MyClass c1 = new MyClass(first);
MyClass c2 = new MyClass(second);
System.out.println("Equals: "+c1.equals(c2));
答案 4 :(得分:0)
Joshua Bloch告诉你如何在“Effective Java”的chapter 3中实现equals和hashCode(它们必须串联完成)。这应该告诉你所有你需要知道的,以便覆盖你的班级的等于。