-1

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


@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);
}

@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

我在 Matrix 类中有 equals。是因为它的实施还是我做错了什么?

4

2 回答 2

2
 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++;
}

...这不符合您的要求。

(这是使用自动格式化程序的绝佳理由,它将向您显示误导性缩进。)

于 2020-11-16T19:12:44.650 回答
1
 if(this.matrix[i][j] == matrix.matrix[i][j])
                counter++;

只是在这里猜测,因为我看不到对象的其余部分,但是您正在比较两个 Matrix 中 i,j 位置中包含的对象是否相同。你需要比较它们的价值。

另一方面,您正在比较 Matrix 类的内部矩阵字段,但您似乎只是为 Matrix 类覆盖了 equals 。尝试改变

assertEquals(matrix1.matrix, matrix2.matrix);

assertEquals(matrix1, matrix2);
于 2020-11-16T19:05:14.973 回答