2012-01-25 5 views
1

Его очень просто, но как-то не работает (странно !!).Java: добавление объектов в список объектов

У меня есть класс класса. Я добавляю объекты в список в цикле for. До добавления объекта все в порядке, но как только я попытаюсь получить доступ к списку, отображаются только значения последнего объекта (см. Вывод, который я привел ниже). Также здесь код:

List<myClass> myClassList = new ArrayList<myClass>(); 
    myClass myClassObj = new myClass(); 

    for(int i=0;i<someArray.length;i++){ 
     myClassObj.setProperty1("value1"); 
     myClassObj.setProperty2("value2"); 
     myClassObj.setProperty3("value3"); 
     ... 
     ...Others 
     ... 
     System.out.println(myClassList.add(myClassObj));//////////////////////// 
    } 

    System.out.println(myClassList.size());///////////////////////////////////// 

    for(int i=0;i<myClassList.size();i++){ 
     System.out.println(myClassList.get(i).getProperty1());///////////////// 
     ..... 
     .....Others 
     ..... 
    } 
    Iterator<myClass> mcItr = myClassList.iterator(); 
    while(mcItr.hasNext()){ 
     myClass obj = mcItr.next(); 
     System.out.println(obj.getProperty1()); 
     ..... 
     .....Others 
     ..... 
    } 

выход этой программы (если размер someArray является):

//'true' --> 5 times. Printed by the 'add' statement as it returns 'true' when everything is OK 

    //5 --> Size of 'myClassList' this is also OK 

    //Here the values corresponding to the fifth and the last object are printed and repeated 5 times. Instead of printing each objects value once. (whichever way of printing to console I may use, the result is same). 

Здесь я не могу понять, ли я создавать список неправильным способом или доступ к нему неправильным образом.

Прошу совета.

Спасибо!

+0

же класс refrence является виновником –

+0

Вам нужно положить 'MyClass myClassObj = новый MyClass();' внутри первого цикла FOR. Иначе вы просто перезаписываете начальную переменную новыми значениями. – Frankline

+0

@UmeshAwasthi: Я понял. Благодаря!! – kanishk

ответ

5

При заполнении списка вы повторно добавляете ссылки на тот же объект. Для того, чтобы исправить, переместите myClassObj инициализацию в петлю:

for(int i=0;i<someArray.length;i++){ 
    myClass myClassObj = new myClass(); // <---- moved this into the loop 
    myClassObj.setProperty1("value1"); 

Это создаст отдельный объект для каждого элемента списка.

+0

О да! Ты прав!! Я знал, что это будет что-то вроде этого. Благодаря!! – kanishk

+1

@kanishk Не забудьте принять ответы, которые вам помогли. –

+0

@NickBull: Ответ не может быть принят до 10-15 минут. Он собирался это сделать. Спасибо за напоминание в любом случае :) !! – kanishk

2

Вам нужно создать новый myClassObj каждый раз, ваш код использует ту же ссылку на объект.

List<myClass> myClassList = new ArrayList<myClass>(); 

    for(int i=0;i<someArray.length;i++){ 
     myClass myClassObj = new myClass(); // HERE 
     myClassObj.setProperty1("value1");  
     ... 
     System.out.println(myClassList.add(myClassObj));//////////////////////// 
    } 
+0

Ты избил меня! – adarshr

+0

Спасибо! Понял – kanishk

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