Java二维数组与矩阵:equals方法实现求助
Matrix类equals方法问题排查与修复
问题根源分析
你的equals方法存在多处逻辑错误,导致本该返回false的测试用例返回true:
- 冗余的类型检查:开头已经通过
!(o instanceof Matrix)过滤了非Matrix对象,后续的if(o instanceof Matrix)判断完全多余,不会改变执行逻辑。 - 循环边界错误:
- 外层循环用
i < data[i].length作为终止条件,会把当前行的列数当成行数的遍历上限,导致无法遍历所有行(比如3行2列的矩阵,i只会循环0、1两次,漏掉第3行)。 - 内层循环用
j < data[j].length逻辑完全错误:j是列索引,却用data[j](第j行的数组)的长度作为列的上限,不仅会导致数组越界(当j超过矩阵行数时),还无法正确遍历所有列。
- 外层循环用
- 非法的对象访问:
o[i][j]是错误写法——o是Object类型,不支持数组下标访问,应该使用已经强转后的m对象的内部数据。 - 未提前校验矩阵维度:如果两个矩阵的行数或列数不同,直接就应该返回false,你的代码跳过了这一步,导致维度不同的矩阵可能被误判为相等。
- 未及时终止循环:即使发现元素不相等,仍会继续遍历剩余元素,效率低下。
修正后的equals方法
@Override public boolean equals(Object o) { // 同一对象直接返回true,提升效率 if (this == o) return true; // 非Matrix类型直接返回false if (!(o instanceof Matrix)) return false; Matrix m = (Matrix) o; // 维度不同直接返回false if (numRows != m.numRows || numColumns != m.numColumns) return false; // 遍历所有元素逐一比较 for (int i = 0; i < numRows; i++) { for (int j = 0; j < numColumns; j++) { if (data[i][j] != m.data[i][j]) { return false; // 发现不等立即返回,无需继续遍历 } } } return true; }
关键修复点说明
- 同一对象快速判断:
this == o可以直接返回true,避免不必要的元素遍历,提升性能。 - 维度优先校验:先比较行数和列数,维度不一致直接返回false,从根源避免维度不同的误判。
- 循环边界修正:外层循环用
numRows控制行数遍历,内层用numColumns控制列数遍历,确保所有元素都被检查。 - 正确访问对比元素:使用
m.data[i][j]访问对比矩阵的元素,符合Java语法规范。 - 及时终止循环:一旦发现不相等的元素,立即返回false,减少不必要的计算。
内容的提问来源于stack exchange,提问作者Preston Little
相关产品推荐
相关产品推荐

