猿问

如何在Java中对2d数组进行深度复制?

如何在Java中对2d数组进行深度复制?

我只是因为用.clone()在我的2dboolean认为这是一个很深的拷贝。

如何执行boolean[][]阵列?

我应该循环一下然后做一系列的System.arraycopy是什么?


米脂
浏览 739回答 3
3回答

四季花海

是的,您应该在2D布尔数组上进行迭代,以便深入复制它。也看看java.util.Arrays#copyOf方法,如果您在Java 6上。我建议Java 6的下一个代码:public&nbsp;static&nbsp;boolean[][]&nbsp;deepCopy(boolean[][]&nbsp;original)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(original&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;boolean[][]&nbsp;result&nbsp;=&nbsp;new&nbsp;boolean[original.length][]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;original.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;=&nbsp;Arrays.copyOf(original[i],&nbsp;original[i].length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;For&nbsp;Java&nbsp;versions&nbsp;prior&nbsp;to&nbsp;Java&nbsp;6&nbsp;use&nbsp;the&nbsp;next: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;System.arraycopy(original[i],&nbsp;0,&nbsp;result[i],&nbsp;0,&nbsp;original[i].length); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}

忽然笑

在Java 8中,可以使用lambdas作为一个一行来实现这一点:<T>&nbsp;T[][]&nbsp;deepCopy(T[][]&nbsp;matrix)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;java.util.Arrays.stream(matrix).map(el&nbsp;->&nbsp;el.clone()).toArray($&nbsp;->&nbsp;matrix.clone());}

慕莱坞森

我已经想出了一个递归数组深度复制。即使对于具有不同尺寸长度的多维数组,它似乎也能很好地工作。private&nbsp;static&nbsp;final&nbsp;int[][][]&nbsp;INT_3D_ARRAY&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{1} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{2,&nbsp;3}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{4,&nbsp;5} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{6,&nbsp;7,&nbsp;8}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{9,&nbsp;10,&nbsp;11}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{12,&nbsp;13,&nbsp;14} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}};这是实用方法。@SuppressWarnings("unchecked")public&nbsp;static&nbsp;<T>&nbsp;T[]&nbsp;deepCopyOf(T[]&nbsp;array)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;>=&nbsp;array.length)&nbsp;return&nbsp;array; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(T[])&nbsp;deepCopyOf( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.newInstance(array[0].getClass(),&nbsp;array.length),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);}private&nbsp;static&nbsp;Object&nbsp;deepCopyOf(Object&nbsp;array,&nbsp;Object&nbsp;copiedArray,&nbsp;int&nbsp;index)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(index&nbsp;>=&nbsp;Array.getLength(array))&nbsp;return&nbsp;copiedArray; &nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;element&nbsp;=&nbsp;Array.get(array,&nbsp;index); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(element.getClass().isArray())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.set(copiedArray,&nbsp;index,&nbsp;deepCopyOf( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.newInstance( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.getClass().getComponentType(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.getLength(element)), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0)); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.set(copiedArray,&nbsp;index,&nbsp;element); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;deepCopyOf(array,&nbsp;copiedArray,&nbsp;++index);}编辑:更新代码以处理基元数组。
随时随地看视频慕课网APP
我要回答