2017-03-21 9 views
3

ArrayListに配列を挿入しましたが、2番目の配列を挿入した後、最初の配列は2番目の配列と同じになります。ArrayListに異なる配列を挿入する

メインクラス:

public static void main(String[] args) { 

    ArrayList<int[]> list = new ArrayList<>(); 

    int[] parent = new int[4]; 

    for (int i = 0; i < 2; i++) { 
     parent[0] = rand(4,1); 
     parent[1] = rand(6, -2); 
     parent[2] = rand(2, 1); 
     parent[3] = rand(-1, -2); 

     list.add(parent); 
    } 

    // to print the arrays of the parent 
    for (int i = 0; i < 2; i++) { 
     int[] arr ; 
     arr = list.get(i); 
     for (int j = 0; j < arr.length; j++) { 
      System.out.println("Value "+arr[j]); 
     } 
     System.out.println("Next Array"); 
    } 

RAND関数//それは私がそれを何度も走っていますが、両方の配列の値がある範囲内でランダムな値

public static int rand(int max,int min) 
{ 
    Random rand = new Random(); 
    int value = 0; 
    return value = rand.nextInt(max + 1 - min) + min; 
} 

を生成するランダム関数であります同じ。

Results

両方の配列の同じ値を取得し、なぜ私はそれを理解できませんでした。

+0

'parent'の定義を' for'ループに移動します。 – luk2302

+0

'int []'はオブジェクトであり、プリミティブな値ではないためです。同じ配列をリストに2回格納しています。 – Gendarme

+0

これは、最初にリストに追加されたオブジェクトが、2回目に追加されたオブジェクトと同じであるためです。したがって、forループの2回目の繰り返しで変更され、2回印刷されます。 – Rlarroque

答えて

6
は、そうでなければ、あなたは、配列を作成している

for (int i = 0; i < 2; i++) { 
    int[] parent = new int[4]; 
    parent[0] = rand(4,1); 
    parent[1] = rand(6, -2); 
    parent[2] = rand(2, 1); 
    parent[3] = rand(-1, -2); 

    list.add(parent); 
} 

にあなたのコードを変更

、リストに追加し、その値を設定。次に、の値を同じ配列に変更してもう一度追加します。したがって、のリストには同じアレイが2回入っています。配列自体には、2番目の反復の乱数が含まれています。

2

parentをArrayListに追加し、parentの値を変更してから、ArrayListに再度追加します。 ArrayListのは参照によってINT []を保持しているので、あなたはparentの値を変更するとき、あなたはlist.getの値を変更している(0)あなたは、あなたがに追加するたびに新しい配列を作成する必要が

ArrayList

1

ArrayListparent配列の同じオブジェクトを追加するためです。あなたは、重複配列の値を参照してください理由は、それが重複していないということである。この

for (int i = 0; i < 2; i++) { 
int[] parent = new int[4]; 
..... 
} 

のようなforループに移動可能性があり、それを固定するために

int[] parent = new int[4]; 

for (int i = 0; i < 2; i++) { 
    parent[0] = rand(4,1); 
    parent[1] = rand(6, -2); 
    parent[2] = rand(2, 1); 
    parent[3] = rand(-1, -2); 

    list.add(parent); // it's still the same object, but now twice in the arraylist 
} 

が、よりその同じ配列のようなArrayListで2回利用できます。

2

シンプル:

int[] parent = new int[4]; 

はあなたのループにに行く必要があります。

それ以外の場合は、同じ配列インスタンスをそのリストに何度も追加し続けます。

関連する問題