在java中复制多维数组

时间:2012-11-28 23:31:04

标签: java multidimensional-array copy erase

在Java中,我们如何制作三维数组的副本? 事实是,当我们使用new_array.clone()或类似的东西时,我们将条目的地址放入another_array,而不是实际值。 因此,当我清除()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

}

5 个答案:

答案 0 :(得分:3)

在Java中,当您执行以下操作时始终引用对象:

   moves1.add(mid_array);

这意味着mid_array已添加到moves1,但仍以mid_array引用。这样,当你拨打mid_array.clear()时,它会从两个地方清除。

如果您想在moves1内维护列表,那么最好在mid_array循环内创建for的新实例,例如下面:

 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
 }

答案 1 :(得分:2)

这会产生一个真实副本,包括复制所有元素。

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;
}

它使用this cloning library复制元素。

按如下方式使用:

List<List<List<YourClass>>> original = ...
List<List<List<YourClass>>> copy = list3DCopy(original);

答案 2 :(得分:0)

通常你必须手动进行深层复制(除非对象支持你,文档会告诉你)。在这种情况下,您需要使用两个嵌套循环并克隆最底层的ArrayList

答案 3 :(得分:-1)

您可以创建ArrayList的子类并覆盖clone()方法以执行深层复制而不是浅层复制。例如:

public class DeepCopyArrayList extends ArrayList
{
  public Object clone()
  {
     // implement deep copy clone here
  }
}

一旦你有了这个,你只需要做

myArray.clone()

答案 4 :(得分:-3)

如果你愿意,你可以用丑陋的方式做到这一点。我忘记了是否有功能可以做到这一点,但如果你想手动这样做就行了。

 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&lt; 10或其他任何一个实际上应该是i&lt;数组维度的长度。