2017-09-15 6 views
-1

私は過去4日間Javaコードに問題があります。私の人生では、その根本原因を見つけることができません。ArrayListの参照の代わりに値を格納する

基本的には、オブジェクトのリストを属性として持つオブジェクトのリストのArrayListを作成します。しかし、リストの最初の要素にメソッドを適用しようとすると、他のオブジェクトも同様に更新されます!

public class Matrix { 
    public double[][] A; 

    public Matrix(double[][] A) { 
     this.A = A; 
    } 
} 
public class Model { 
    public Matrix M; 

    public Model(Matrix M) { 
     this.M = M; 
    } 

    public static Model(Model m) { 
     // modifying model a bit 
     return newModel; 
    } 
} 

public class MyProgram { 
    public ArrayList<Model> models; 

    public main() { 
     this.models = new ArrayList<Model>(NUM); 
     Matrix A = randomMatrix(); 
     for (int i = 0; i < NUM; i++) { 
      this.models.add(new Model(A)); 
     } 
    } 

    public otherMethod() { 
     this.models.set(0, changeModel(this.models.get(0))); 
    } 
} 

問題は、私はotherMethodを起動するたびに、リスト内のすべてのモデルが同様に変更を取得している:

は、ここに私のオブジェクト構造の基本的な概要です!

+1

そして、何がうまくいきませんか?特定の問題/出力の問題については説明していませんか? –

+0

Javaはあなたの言った通りです。そしてあなたは、あなたのすべてのモデルがそれらの中に同じ 'Matrix'を持つべきだと言っていました。だから、あるモデルで 'Matrix'を変更すると、他のすべてのモデルでも同じ' Matrix'を変更します。 –

+0

@TheophileDano私は問題: – Mehdi

答えて

2

あなたは2-D arrayそれを割り当てないcloneする必要があります。

ので、代わりのthis.A = A;

あなたはコピーのために、このようなものを使用する必要があります。

public static int[][] deepCopyIntMatrix(int[][] input) { 
    if (input == null) 
     return null; 

    int[][] result = new int[input.length][]; 

    for (int r = 0; r < input.length; r++) { 
     result[r] = input[r].clone(); 
    } 
    return result; 
} 
+2

を更新しましたか、 'System.arrayCopy'を使用してください –

0

どうもありがとう、問題がされたが実際には深いコピー:

public class Matrix { publ ic double [] [] A;

public Matrix(double[][] A) { 
    A = new double[n][m]; 
    for(int i=...) 
     for(int j=...) 
       this.A[i][j] = A[i][j]; 
} 

そして、私の行列を追加するには、私はこれをしなかった:

this.models.add(new Model(new Matrix(A.A)))); 
+0

いいえ、これは正確ではありません。そして私が最後の3日間の仕事を失った理由。クローンメソッドは、明らかに1-D配列に対してのみ機能します。 – Mehdi

関連する問題