2016-02-19 2 views
0

В приведенном ниже примере я добавляю элементы в обычный ArrayList, а затем в настраиваемый ArrayList. В то время как первый работает отлично, добавляя каждый элемент в ArrayList, как ожидалось, последнее только, кажется, перезаписывает добавленные элементы.Добавление элементов в стандартный или настроенный ArrayList

Не могли бы вы объяснить, что здесь происходит и как это исправить?

package jExample; 
import java.util.ArrayList; 

public class ForLoopArrayList { 

    public static void main(String[] args) { 

     // customized ArrayList 
     ArrayList<CDatabase> box = new ArrayList<>(); 

     // standard ArrayList 
     ArrayList<String> var1 = new ArrayList<>(); 
     ArrayList<String> var2 = new ArrayList<>(); 

     CDatabase recBox = new CDatabase(); 

     for(int i = 0; i < 9; i++){ 

      // populating customized ArrayList 
      recBox.var1 = i * 1.1; 
      recBox.var2 = i * 11.; 
      box.add(recBox); 

      // populating standard ArrayList 
      var1.add(Double.toString(i * 1.1)); 
      var2.add(Double.toString(i * 11.)); 
     } 

     for(int i = 0; i < var1.size(); i++){ 
     CDatabase test = box.get(i); 
     System.out.println(var1.get(i) + " " + var2.get(i) + " " + test.var1); 
     } 
     System.out.println(var1.size()); 
     System.out.println(box.size());  
    } 

} 

Используя следующий CDatabase класс:

package jExample; 

public class CDatabase { 

    public double var1; 
    public double var2; 

} 
+3

Вы продолжаете перезаписывать свой объект базы данных, вместо этого попробуйте создать новый объект. – Ceelos

+0

Возможный дубликат [Почему мой ArrayList содержит N копий последнего элемента, добавленного в список?] (Http://stackoverflow.com/questions/19843506/why-does-my-arraylist-contain-n-copies-of -the-last-item-added-to-the-list) – Andreas

+0

* FYI: * 'ArrayList ' больше не «настроен», чем 'ArrayList '. Они являются стандартными ArrayLists. Настройка «ArrayList» означает изменение способа работы * списка *. – Andreas

ответ

1

Как я уже писал в своем комментарии, проблема заключается в том, что вы продолжаете писать один и тот же объект CDatabase, попытайтесь создать новый объект каждый раз, когда вместо того, чтобы, перемещая CDatabase recBox = new CDatabase(); внутри для цикла, как, например:

CDatabase recBox; 

    for (int i = 0; i < 9; i++) { 
     recBox = new CDatabase(); 
     // populating customized ArrayList 
     recBox.var1 = i * 1.1; 
     recBox.var2 = i * 11.; 
     box.add(recBox); 

     // populating standard ArrayList 
     var1.add(Double.toString(i * 1.1)); 
     var2.add(Double.toString(i * 11.)); 
    } 


Ура!

Смежные вопросы