我有这个名为band的三维数组。我需要做4份副本,所以我可以与所有这些副本并行工作。
int bands[][][] = new int[param][][];
我需要数组保持三维数组,因为它是一些需要int [][][]
的方法的输入
我怎么能做这样的副本?我正在考虑使用像这样的arrayList:
List<Integer[][][]> bandsList = new ArrayList<Integer[][][]>();
bandsList.add(bands);
但是我在最后一行收到此错误:类型add(Integer[][][])
中的方法List<Integer[][][]>
不适用于参数(int[][][])
那我该怎么办?
答案 0 :(得分:1)
错误是因为int[][][]
与Integer[][][]
不同。
int[][][]
是一个原始的3D数组 int
。
Integer[][][]
是一个对象的3D数组 Integer
,它是int
的包装类。
嗯,从技术上讲,3D数组是一个指向2D数组的指针数组,这是一个指向一维数组的指针数组,这是一个基元数组或指向对象的指针。
改为使用List<int[][][]> bandsList = new ArrayList<int[][][]>();
。
另请注意
bandsList.add(bands);
bandsList.add(bands);
只会将2个指针添加到同一个数组中,更改一个也会更改另一个。
您需要手动复制它们:
int[][][] getCopy(int[][][] bands)
{
int[][][] newBands = new int[bands.length][][];
for (int i = 0; i < bands.length; i++)
{
newBands[i] = new int[bands[i].length];
for (int j = 0; j < bands[i].length; j++)
{
newBands[i][j] = new int[bands[i][j].length];
System.arraycopy(bands, 0, newBands, 0, bands[i][j].length))
}
}
return newBands;
}
// to add
bandsList.add(getCopy(bands));
答案 1 :(得分:0)
这样你就不会复制数组,你必须这样做4次:
int cloneList[][][] = new int[param][..][..];
for(int i = 0; i<bands.length; i++) {
int arr1[][] = bands[i];
for(int j = 0; j<arr1.length; j++) {
int arr2[] = arr1[j];
for(int k = 0; k<arr2.length; k++) {
int x = arr2[k];
cloneList[i][j][k] = x;
}
}
}