-1

Java で 3 次元配列のコピーを作成するにはどうすればよいですか? つまり、またはそのようなものを使用する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

}
4

5 に答える 5

3

Java では、オブジェクトは常に参照されるため、次のようにします。

   moves1.add(mid_array);

mid_arrayに追加されmoves1 ますが、参照されることを意味しmid_arrayます。このように、 を呼び出すとmid_array.clear()、両方の場所から明確になります。

内のリストを維持したい場合は、ループ内のmoves1新しいインスタンスを作成することをお勧めします:mid_arrayfor

 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
 }
于 2012-11-28T23:40:39.097 に答える
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;
}

この複製ライブラリを使用して要素をコピーします。

次のように使用します。

List<List<List<YourClass>>> original = ...
List<List<List<YourClass>>> copy = list3DCopy(original);
于 2012-11-29T00:04:03.390 に答える
0

通常、ディープ コピーを手動で行う必要があります (オブジェクトがそれをサポートしていない限り、ドキュメントに記載されています)。この場合、ネストされた 2 つのループを使用し、一番下の を複製する必要がありますArrayList

于 2012-11-28T23:39:44.157 に答える
-1

ArrayList のサブクラスを作成し、 clone() メソッドをオーバーライドして、浅いコピーではなく深いコピーを実行できます。例えば:

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

これを手に入れたら、あとはやるだけです

myArray.clone()
于 2012-11-28T23:47:03.420 に答える
-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< 10 またはその他のいずれかは、実際には i< 配列次元の長さである必要があります。

于 2012-11-28T23:41:19.883 に答える