2016-10-13 6 views
0

私はデータベースから取得した番号のループ内のリスト<Integer>から取得した変数を使用してリスト<CustomObject>を満たす方法はありますか?

List<Integer> list = new ArrayList<Integer>(); 

として整数のリストを持っている(このリストは46の異なる番号が含まれている)、私は

List<CustomObject> listNumber2 = new ArrayList<CustomObject>; 

CustomObjectとしてカスタムオブジェクトのリストを入力する必要がありさ:

public class CustomObject { 
    private int DBIndex; 
    private double value; 
    //Getters and Setters follow 
} 

私はlistNumber2を埋めるために、コードのこの部分を使用:

私は listNumber2を充填する前に listを印刷し、それはすべてOKだった値をチェックする
Scanner input = new Scanner(System.in); 
CustomObject temp = new CustomObject(); 
for(Integer i:lista) { 
    temp.setDBIndex(i); 
    System.out.print("Insert value for index no. " + i + " --> "); 
    temp.setValue(input.nextDouble()); 
    listNumber2.add(temp); 
} 

は、それを満たして、それを印刷:それはDBIndexの46(listNumber2.size())回最後の値とvalueの46倍の最後の値でした。.. 私は1つか2つの小さなものを変更しようとしましたが、すべて同じで、その後デバッガを起動しました。 述べタブVariablesvや矢印など>は):

Name    | Value 
v list    | ArrayList<E> (id=38) 
    v elementData | Object[49] (id=42) 
     v [0]  | Integer(id=43) 
      value | 10 
     > [1]  | Integer(id=47) 
     > [2]  | Integer(id=48) 
     > ...  | ... 
    > modCount  | 46 
    > size   | 46 
v listNumber2  | ArrayList<E> (id=15) 
    v elementData | Object[10] (id=41) 
     v [0]  | CustomObject (id=36) 
      DBIndex | 79 
      value | 4.45 
     v [1]  | CustomObject (id=36) 
      DBIndex | 79 
      value | 4.45 
     > [2]  | CustomObject (id=36) 
     > ...  | ... 
    v modCount  | 46 
    v size   | 46 

たびに、デバッグの際に、その命令temp.setDBIndex(i);forループの新しいiと新しい価値のに変更listNumber2のすべてのDBIndexを通過しましたScannerは、temp.setValue(input.nextDouble());の後に前のものを上書きするためにvalueと入力されます。したがって、最後にリスト内のすべてのオブジェクトは同じ値を持ちます。さらに、変数セクションにあるように、リスト内のすべてのオブジェクトはコピーされたのと同じIDを持ちます。 どのように可能ですか?この問題を解決するための選択肢はありますか?

答えて

0

カスタムオブジェクトの46個のインスタンスを作成するのではなく、同じオブジェクトを46回追加するのではなく、ループ内で変更すると、メモリ内の同じオブジェクトを実際に指すすべての参照が変更されます。 解決策は、CustomObject temp = new CustomObject();をforループに移動することです。

0

listNumber2に別々のオブジェクトが含まれている必要があるため、カスタムオブジェクトの初期化をループに入れてみます。

関連する問題