我有一个名为int的int类型的二维数组,我想复制到方法中的局部变量,所以我可以编辑它
什么是复制阵列的最佳方法,我遇到了一些麻烦
例如
int [][] myInt;
for(int i = 0; i< matrix.length; i++){
for (int j = 0; j < matrix[i].length; j++){
myInt[i][j] = matrix[i][j];
}
}
//do some stuff here
return true;
}
答案 0 :(得分:77)
复制数组的两种好方法是使用clone和System.arraycopy()
。
以下是如何将克隆用于2D案例:
int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
myInt[i] = matrix[i].clone();
对于System.arraycopy(),您使用:
int [][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
int[] aMatrix = matrix[i];
int aLength = aMatrix.length;
myInt[i] = new int[aLength];
System.arraycopy(aMatrix, 0, myInt[i], 0, aLength);
}
我没有基准测试,但我可以用我的 2美分打赌,他们比自己做的更快,而且更不容易出错。特别是System.arraycopy()
,因为它是在本机代码中实现的。
希望这会有所帮助。
编辑:修复错误。
答案 1 :(得分:12)
可以在Java 8中使用流来复制2D数组。
@Test
public void testCopy2DArray() {
int[][] data = {{1, 2}, {3, 4}};
int[][] dataCopy = Arrays.stream(data)
.map((int[] row) -> row.clone())
.toArray((int length) -> new int[length][]);
assertNotSame(data, dataCopy);
assertNotSame(data[0], dataCopy[0]);
assertNotSame(data[1], dataCopy[1]);
dataCopy[0][1] = 5;
assertEquals(2, data[0][1]);
assertEquals(5, dataCopy[0][1]);
}
答案 2 :(得分:6)
您没有初始化本地2D阵列。
int[][] myInt = new int[matrix.length][];
for(int i = 0; i < matrix.length; i++)
{
myInt[i] = new int[matrix[i].length];
for (int j = 0; j < matrix[i].length; j++)
{
myInt[i][j] = matrix[i][j];
}
}
答案 3 :(得分:0)
如果数据很大,您应该考虑使用合适的线性代数库,例如 colt
或 nd4j
。如果数组是一维的,System.arraycopy
可能只会更快。否则它无法将整个数据复制为一个单元,然后像在 numpy 或 R 中那样对其进行整形。
答案 4 :(得分:-12)
你也可以像这样编码 myInt = matrix.clone();