Как заполнить список переменными, взятыми из списка в цикле?

#java #list #loops #object #arraylist

#java #Список #циклы #объект #arraylist

Вопрос:

У меня есть список целых чисел в виде

 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 :

 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);
}
 

Чтобы проверить значения, которые я напечатал list перед заполнением listNumber2 , и все было в порядке, затем заполнил его и напечатал: оно было в 46 ( listNumber2.size() ) раз больше последнего значения DBIndex и в 46 раз больше последнего значения value
Я попытался изменить одну или две мелочи, но все было по-прежнему, затем запустил отладчик.
На вкладке Variables указано ( v и > в виде стрелок):

   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); every DBIndex of listNumber2 , измененную в новую i из for цикла, и новое значение Scanner заполненного каждого value перезаписывало предыдущее, после temp.setValue(input.nextDouble()); , так что, в конце концов, каждый объект в списке имеет одинаковые значения. Кроме того, как вы можете видеть в разделе переменные, каждый объект в списке имеет тот же идентификатор, что и скопированный.
Как это вообще возможно? Есть ли у меня какой-нибудь альтернативный вариант решения этой проблемы?

Ответ №1:

Вместо создания 46 экземпляров CustomObject вы добавляете один и тот же объект 46 раз — поэтому, когда вы меняете его в цикле, он изменяется для всех ссылок, которые фактически указывают на один и тот же объект в памяти. Решение состоит в том, чтобы перейти CustomObject temp = new CustomObject(); в цикл for .

Ответ №2:

попробуйте поместить инициализацию CustomObject в цикл, потому что listNumber2 должен содержать отдельные объекты.