如何在Java中复制2维数组?

我需要为我正在处理的项目制作一个相当大的二维数组的副本。 我有两个二维数组:

int[][]current; int[][]old; 

我也有两种方法来进行复制。 我需要复制数组,因为当前正在更新。

 public void old(){ old=current } 

 public void keepold(){ current=old } 

但是,这是行不通的。 如果我打电话给老,就更新一下当前的电话,然后叫keepold,电stream不等于原来的。 为什么会这样?

谢谢

current=oldold=current使得这两个数组指向相同的东西,所以如果你随后修改currentold也将被修改。 要将数组的内容复制到另一个数组,请使用for循环

 for(int i=0; i<old.length; i++) for(int j=0; j<old[i].length; j++) old[i][j]=current[i][j]; 

PS:对于一维数组,您可以避免使用Arrays.copyOf创build自己的循环

 /** * Clones the provided array * * @param src * @return a new clone of the provided array */ public static int[][] cloneArray(int[][] src) { int length = src.length; int[][] target = new int[length][src[0].length]; for (int i = 0; i < length; i++) { System.arraycopy(src[i], 0, target[i], 0, src[i].length); } return target; } 

是否有可能修改此代码以支持对象的n维数组

您需要支持任意长度的数组,并检查src和destination是否具有相同的维度, 并且还需要recursion地复制每个数组中的每个元素,以防Object也是一个数组。

自从发布这个以来已经有一段时间了,但是我发现了一种创buildn维数组类的好方法。 该类在构造函数中使用零个或多个整数,指定每个维度的相应大小。 该类使用一个底层的平面数组Object[]并使用维数和一个乘数组来计算每个元素的索引。 (这是用C编程语言完成的数组。

复制NDimensionalArray的实例就像复制任何其他二维数组一样简单,但需要声明每个NDimensionalArray对象具有相同的维度。 这可能是最简单的方法,因为没有recursion,这使得表示和访问更简单。

我解决了它写一个简单的函数来复制使用System.arraycopy多维int数组

 public static void arrayCopy(int[][] aSource, int[][] aDestination) { for (int i = 0; i < aSource.length; i++) { System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length); } } 

或者实际上我改进了我的用例:

 /** * Clones the provided array * * @param src * @return a new clone of the provided array */ public static int[][] cloneArray(int[][] src) { int length = src.length; int[][] target = new int[length][src[0].length]; for (int i = 0; i < length; i++) { System.arraycopy(src[i], 0, target[i], 0, src[i].length); } return target; } 
 current = old ; 

赋值操作不会将一个数组的元素复制到另一个数组中。 你只是使currentmatrix参考oldmatrix。 你需要做一个明智的副本。

java中的数组是对象,所有对象都通过引用传递 。 为了真正“复制”一个数组,而不是为一个数组创build另一个名字,你必须去创build一个新的数组并复制所有的值。 请注意,System.arrayCopy将完全复制一维数组,但不是二维数组。 原因在于二维数组实际上是一维数组的一维数组,而数组拷贝通过指向相同内部一维数组的指针。

 public static byte[][] arrayCopy(byte[][] arr){ if(arr!=null){ int[][] arrCopy = new int[arr.length][] ; System.arraycopy(arr, 0, arrCopy, 0, arr.length); return arrCopy; }else { return new int[][]{};} } 

你也可以这样做:

 public static int[][] copy(int[][] src) { int[][] dst = new int[src.length][]; for (int i = 0; i < src.length; i++) { dst[i] = Arrays.copyOf(src[i], src[i].length); } return dst; } 

我正在使用这个function:

 public static int[][] copy(final int[][] array) { if (array != null) { final int[][] copy = new int[array.length][]; for (int i = 0; i < array.length; i++) { final int[] row = array[i]; copy[i] = new int[row.length]; System.arraycopy(row, 0, copy[i], 0, row.length); } return copy; } return null; } 

这种方法的一大优点是它也可以复制不具有相同行数的数组,例如:

 final int[][] array = new int[][] { { 5, 3, 6 }, { 1 } }; 

以下是如何使用循环来完成的。

 public static int[][] makeCopy(int[][] array){ b=new int[array.length][]; for(int row=0; row<array.length; ++row){ b[row]=new int[array[row].length]; for(int col=0; col<b[row].length; ++col){ b[row][col]=array[row][col]; } } return b; } 

你可以试试下面的代码,

 public void multiArrayCopy(int[][] source,int[][] destination){ destination=source.clone();} 

希望它的作品。