如何在Java中复制2维数组?
我需要为我正在处理的项目制作一个相当大的二维数组的副本。 我有两个二维数组:
int[][]current; int[][]old;
我也有两种方法来进行复制。 我需要复制数组,因为当前正在更新。
public void old(){ old=current }
和
public void keepold(){ current=old }
但是,这是行不通的。 如果我打电话给老,就更新一下当前的电话,然后叫keepold,电stream不等于原来的。 为什么会这样?
谢谢
current=old
或old=current
使得这两个数组指向相同的东西,所以如果你随后修改current
, old
也将被修改。 要将数组的内容复制到另一个数组,请使用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 ;
赋值操作不会将一个数组的元素复制到另一个数组中。 你只是使current
matrix参考old
matrix。 你需要做一个明智的副本。
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();}
希望它的作品。