如何将两个长度及内部子数组长度各异的Java 2D Array合并为一个?
合并两个结构不同的二维数组(Java实现)
需求很明确:把两个自身长度、内部子数组长度都不一致的二维数组合并成一个新的二维数组,完全保留原有的子数组结构。
原代码的问题
你当前的代码把两个二维数组都拆成了一维数组再合并,这直接丢失了原有的子数组边界,所以输出是扁平化的一维结果,自然不符合需求。
解决方案
要保留子数组结构,直接操作二维数组的子数组引用即可,不用扁平化处理。步骤很简单:
- 新二维数组的总长度 = 第一个数组的长度 + 第二个数组的长度
- 把第一个数组的所有子数组依次放到新数组的前半部分
- 把第二个数组的所有子数组依次放到新数组的后半部分
如果担心后续修改原数组会影响新数组,可以对子数组进行深拷贝(用Arrays.copyOf);如果只是合并后只读,直接复制引用更高效。
修改后的完整代码
import java.util.Arrays; public class ArraysAndMore { // 修改为返回二维数组 public static int[][] add2D(int[][] ary1, int[][] ary2) { // 新数组的总长度是两个输入数组长度之和 int[][] result = new int[ary1.length + ary2.length][]; // 复制第一个数组的所有子数组 for (int i = 0; i < ary1.length; i++) { // 如果需要深拷贝,替换为 result[i] = Arrays.copyOf(ary1[i], ary1[i].length); result[i] = ary1[i]; } // 复制第二个数组的所有子数组,起始索引是第一个数组的长度 for (int i = 0; i < ary2.length; i++) { // 同样,需要深拷贝就用Arrays.copyOf result[ary1.length + i] = ary2[i]; } return result; } public static void main(String[] args) { int[][] ary2D1 = new int[][]{{1,1,1,1},{2,2,2},{3,3,3}}; int[][] ary2D2 = new int[][]{{4},{5,5,5,5,5}}; // 打印二维数组要用Arrays.deepToString System.out.println(Arrays.deepToString(add2D(ary2D1, ary2D2))); } }
运行结果
输出和期望完全一致:
[[1, 1, 1, 1], [2, 2, 2], [3, 3, 3], [4], [5, 5, 5, 5, 5]]
补充说明
如果你的业务场景中需要确保原数组的修改不会影响合并后的新数组,就把复制子数组的代码改成Arrays.copyOf,比如:
result[i] = Arrays.copyOf(ary1[i], ary1[i].length);
这样新数组的子数组是原数组子数组的副本,互相不影响。
内容的提问来源于stack exchange,提问作者derhussain
相关产品推荐
相关产品推荐

