2016-09-21 4 views
-4

pointと呼ばれる2D arrayListのlastElementを取得し、その最後の要素を、更新されたY値と同じX値を持つ新しい要素としてリストに追加したいとします。だから、基本的には、ポイント2D配列の最後の要素を取得して、それをポイント2D配列の最後に追加しますが、y値を変更します。しかし、問題は、私がyの値を変更すると、情報が取得された要素の値も変更されることです。ArrayList内の要素の値を変更すると、他の要素の値を変更するのはなぜですか?

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 
    point.add(point.get(point.size()-1)); 
    point.get(0).set(1, 200); 
    System.out.println(point); 

出力:[[1、200]、[1、200]] 予想される出力:[[1]、[2]、[1、200]]

+1

コードを表示して、期待される出力と現在の出力を表示してください... –

+1

詳細を明記してください。いくつかのコードを表示します。 –

+0

http://stackoverflow.com/help/how-to-ask http://stackoverflow.com/help/mcve –

答えて

0
point.add(point.get(point.size()-1)); 

として、それが一意であるためコピーとして新しいオブジェクトを作成する必要があります。これは最後にarraylistの2番目の最後の要素にreferenceを追加します。したがって、最後の要素から値を表示しようとすると、最後にvaluesのデータがpointにフェッチされ、表示されます。個別にデータを変更するには、私はこれを指摘行を置き換える:

point.add(new ArrayList<Integer>(values)); 

だからあなたが別途 pointの終わりに valuesの2つのコピーを追加する必要があります。

point.get(0).set(1, 200); //0 denotes first element. not last 

あなたにこの出力が得られます:

[[1, 200], [1, 2]] 

これは

これら2つのエラーはあなたに期待される出力が得られます修正
point.get(point.size() - 1).set(1, 200); //last element 

に置き換える必要があります。

-1

あなたは2番目のエントリを追加する場合

point.add(point.get(point.size()-1)); 

実際には、最初の配列への参照を追加します。したがって、彼らは同じであり、それに応じて変化するのは当然です。

あなたが考えて何をしないよう

point.add(new ArrayList<Integer>(point.get(point.size()-1))); 
0

うまく動作します。この

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values = new ArrayList<Integer>(); 
    values.add(1);// x 
    values.add(2);// y 

    point.add(values); 
    List<Integer> secondList = new ArrayList<Integer>(point.get(point 
      .size() - 1)); 
    secondList.set(1, 200); 
    point.add(secondList); 
    System.out.println(point); 
0
List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 

    List<Integer> values2= new ArrayList<Integer>(); 
    values2.add(point.get(point.size()-1).get(0)); 
    values2.add(point.get(point.size()-1).get(1)); 

    point.add(values2); 
    point.get(1).set(1, 200); 
    System.out.println(point); 

これを試してみてください。 pointに追加された新しい要素が最初の要素と同じ参照を持つため、問題が発生しました。変更は両方の要素に適用されます。

関連する問題