Java合并两个任意类型二维数组的代码错误排查
二维任意类型数组合并方法错误修复
核心错误定位
你的代码存在2处关键的取值逻辑错误,直接导致输出嵌套数组不符合预期:
- 拼接impl数组行元素时取值错误
你在外层循环已经拿到了impl当前遍历到的一维行对象objects,但添加元素时写的是impl[j]——impl是整个二维数组,impl[j]取到的是第j个一维数组对象,不是单个元素,这就是输出里出现嵌套[1]的根本原因,正确取值应为当前行的元素objects[j]。 - 拼接dataProvider数组行元素时取值错误
内层循环添加元素时写的是value,value是dataProvider当前遍历到的一整行一维数组对象,不是单个元素,因此会把整行[12, 6.0]作为单个元素塞入列表,正确取值应为当前行的元素value[k]。
另外你写的list.clear()属于冗余代码:每次进入双层循环都会新建一个ArrayList对象,赋值给结果数组后局部变量会自动出作用域被回收,不需要手动清空。
修正代码
方案1:保留原有下标遍历结构,仅修正错误取值
public Object[][] merge(Object[][] impl, Object[][] dataProvider) { int n = dataProvider.length; int m = impl.length; Object[][] merged = new Object[m * n][]; int countLines = 0; for (Object[] objects : impl) { for (Object[] value : dataProvider) { List<Object> list = new ArrayList<>(); for (int j = 0; j < objects.length; j++) { list.add(j, objects[j]); // 修正:取当前行的单个元素,而非整个二维数组的行对象 } for (int k = 0; k < value.length; k++) { list.add(list.size(), value[k]); // 修正:取当前行的单个元素,而非整行数组 } merged[countLines] = list.toArray(); countLines++; } } return merged; }
方案2:用增强for循环简化写法(更不易出现下标/对象引用错误)
public Object[][] merge(Object[][] impl, Object[][] dataProvider) { int totalRows = impl.length * dataProvider.length; Object[][] merged = new Object[totalRows][]; int rowIndex = 0; for (Object[] implRow : impl) { for (Object[] dataRow : dataProvider) { List<Object> currentRow = new ArrayList<>(); // 拼接impl当前行所有元素 for (Object ele : implRow) { currentRow.add(ele); } // 拼接dataProvider当前行所有元素 for (Object ele : dataRow) { currentRow.add(ele); } merged[rowIndex++] = currentRow.toArray(); } } return merged; }
结果验证
用你提供的测试用例运行上述代码,将得到完全符合预期的结果:
Object[][] result = new Object[][]{ {1, 12, 6.0}, {1, 6, 3.0}, {2, 12, 6.0}, {2, 6, 3.0}, {3, 12, 6.0}, {3, 6, 3.0} };
内容的提问来源于stack exchange,提问作者Myroslava Vynokur
相关产品推荐
相关产品推荐

