[英]Replicate multidimensional array in java
在 Java 中,我们如何制作 3-D 数组的副本? new_array.clone()
是,当我们使用new_array.clone()
或类似的东西时,我们将条目的地址放入 another_array 中,而不是实际值。 因此,当我 clear() old_array
, new_array
也是空的
private List<List<List<String>>> moves = new ArrayList<List<List<String>>>();
private List<List<List<String>>> moves1 = new ArrayList<List<List<String>>>();
.blah
.blah
.blah
mid_array = new ArrayList<List<String>>();//will use this array to insert inot moves1
for(int f = 0; f < moves.size(); f++)//make a copy of original array.
{
List<String> row_st = moves.get(f).get(0);
List<String> deck_st = moves.get(f).get(1);
mid_array.add(row_st);//current array of the Rows
mid_array.add(deck_st);//current array of the Deck
moves1.add(mid_array);
System.out.println("Moves1 "+moves1);//displays the new array correctly
mid_array.clear();//clear mid_array, NOT moves1 or moves arrays
System.out.println("Moves1 "+moves1);//new array is now empty
}
在 Java 中,对象总是被引用,所以当你这样做时:
moves1.add(mid_array);
这意味着mid_array
已添加到moves1
但仍由mid_array
引用。 这样,当您调用mid_array.clear()
,两个地方都清楚。
如果你想在moves1
维护列表,那么最好在for
循环中创建一个mid_array
的新实例,例如下面:
for(int f = 0; f < moves.size(); f++)//make a copy of original array.
{
List<List<String>> mid_array = new ArrayList<List<String>>();
List<String> row_st = moves.get(f).get(0);
List<String> deck_st = moves.get(f).get(1);
mid_array.add(row_st);//current array of the Rows
mid_array.add(deck_st);//current array of the Deck
moves1.add(mid_array);
System.out.println("Moves1 "+moves1);//displays the new array correctly
//No need to clear as in each iteration, it will instantiate a new mid_array
}
这会产生一个真正的副本,包括复制所有元素。
public static <T> List<List<List<T>>> list3DCopy(List<List<List<T>>> source) {
List<List<List<T>>> result = new ArrayList<>(source.size());
Cloner cloner = new Cloner();
for(List<List<T>> innerList : source) {
List<List<T>> copy = new ArrayList<>(innerList.size());
for (List<T> innerInnerList : innerList) {
List<T> innerCopy = new ArrayList<>(innerInnerList.size());
for (T item : innerInnerList) {
T clone = cloner.deepClone(item);
innerCopy.add(clone);
}
copy.add(innerCopy);
}
result.add(copy);
}
return result;
}
它使用这个克隆库来复制元素。
使用方法如下:
List<List<List<YourClass>>> original = ...
List<List<List<YourClass>>> copy = list3DCopy(original);
通常你必须手动进行深拷贝(除非对象支持你,文档会告诉你)。 在这种情况下,您需要使用两个嵌套循环并克隆最底层的ArrayList
。
您可以创建 ArrayList 的子类并覆盖 clone() 方法来执行深拷贝而不是浅拷贝。 例如:
public class DeepCopyArrayList extends ArrayList
{
public Object clone()
{
// implement deep copy clone here
}
}
一旦你有了这个,你只需要做
myArray.clone()
好吧,如果你愿意,你可以用丑陋的方式来做。 我忘记是否有一个功能可以做到这一点,但如果你想手动完成,这里是方法。
int array[10][10][10] = ...// just assume they are all filled.
int newArray[10][10][10];
for(int i = 0; i< 10; i++)
{
for(int j = 0; j< 10; j++)
{
for(int k = 0; k< 10; k++)
{
newArray[i][j][k] = array[i][j][k];
}
}
}
array = NULL;
这只是一个例子,可能不是正确的语法,但这种方式应该有效。 i< 10 或其他任何一个实际上应该是 i< 数组维度的长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.