为什么equals()方法不能按预期工作?

5kgi1eie  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(488)
@Override
public boolean equals(Object obj) {
    if(this == obj) return true;
    if(obj == null) return false;
    if (!(obj instanceof Matrix)) return false;

    Matrix matrix = (Matrix) obj;
    int counter = 0;
    if(this.rowIndex == matrix.rowIndex && this.columnIndex == matrix.columnIndex){

        for(int i=0; i<this.rowIndex; i++)
            for(int j=0; j<this.columnIndex; j++)
                if(this.matrix[i][j] == matrix.matrix[i][j]);
                    counter++;
    }
    return counter == (matrix.rowIndex * matrix.columnIndex);
}

这是我目前的equals实现,它比较两个矩阵是否相同。问题是,当我运行测试时,它说它们是不同的。

@Test
void changeValorTest(){
    Matrix matrix1 = new Matrix(3, 3, true);
    matrix1.changeValor(1,1,5);
    Integer[][] matrix2Real = {{0, 0, 0}, {0, 5, 0}, {0, 0, 0}};
    Matrix matrix2 = new Matrix(matrix2Real, true);
    assertEquals(matrix1.matrix, matrix2.matrix);

    assertThrows(IllegalArgumentException.class, () -> matrix1.changeValor(0,-10, 7));
}

以及输出:

org.opentest4j.AssertionFailedError: expected: [[Ljava.lang.Integer;@305fd85d<[[0, 0, 0], [0, 5, 0], [0, 0, 0]]> but was: [[Ljava.lang.Integer;@7a1ebcd8<[[0, 0, 0], [0, 5, 0], [0, 0, 0]]>

Expected :[[Ljava.lang.Integer;@305fd85d
Actual   :[[Ljava.lang.Integer;@7a1ebcd8

我在矩阵课上有等号。是因为它的实施,还是我做错了什么?请帮忙

aelbi1ox

aelbi1ox1#

if(this.matrix[i][j] == matrix.matrix[i][j])
                counter++;

只是猜测一下,因为我看不到对象的其余部分,但是您正在比较两个矩阵中i,j位置中包含的对象是否相同。你需要比较他们的价值。
另一方面,您正在比较matrix类的内部matrix字段,但是您似乎只为matrix类重写equals。尝试改变

assertEquals(matrix1.matrix, matrix2.matrix);

assertEquals(matrix1, matrix2);
8fsztsew

8fsztsew2#

if(this.matrix[i][j] == matrix.matrix[i][j]);

删除此行末尾的分号。
这里有分号,代码就相当于

if(this.rowIndex == matrix.rowIndex && this.columnIndex == matrix.columnIndex){
    for(int i=0; i<this.rowIndex; i++) {
        for(int j=0; j<this.columnIndex; j++) {
            if(this.matrix[i][j] == matrix.matrix[i][j]) {
            }
        }
    }
    counter++;
}

…这不是你想要的。
(这是使用自动格式化程序的一个很好的理由,它将显示错误的缩进。)

相关问题