ArrayLists указывает на тот же объект или данные в Android

У меня есть два объекта arraylist, имеющих один и тот же тип. Хотите скопировать данные одного в другой путем внесения необходимых изменений. Но это меняет эффект обоих моих объектов. следующий код

private ArrayList<Class_Summery_Enrollment> arrangeRecords(ArrayList<Class_Summery_Enrollment> source){
    ArrayList<Class_Summery_Enrollment> records = new ArrayList<Class_Summery_Enrollment>();
    ArrayList<Class_Meeting_Pattern_Enrollment> pattersList = new ArrayList<Class_Meeting_Pattern_Enrollment>();
    Class_Meeting_Pattern_Enrollment meetingPatternRec;
    Class_Summery_Enrollment rec = new Class_Summery_Enrollment();

    for(int i = 0 ;i<source.size();i++){
        if(source.get(i).getClass_MEETING_PATTERNS().size()>1){
            Log.v(Constants.TAG, "Total Patterns  = "+source.get(i).getClass_MEETING_PATTERNS().size());
            int size_ = source.get(i).getClass_MEETING_PATTERNS().size();
            for(int c = 0;c<size_;c++){
                rec = new Class_Summery_Enrollment();
                rec = source.get(i);
                if(c==0){
                    for (int k =0;k<source.get(i).getClass_MEETING_PATTERNS().size();k++){
                        pattersList.add(source.get(i).getClass_MEETING_PATTERNS().get(k));  
                    }
                }   
                rec.getClass_MEETING_PATTERNS().get(0).setSsr_INSTR_LONG(pattersList.get(c).getSsr_INSTR_LONG());
                rec.getClass_MEETING_PATTERNS().get(0).setSsr_MTG_LOC_LONG(pattersList.get(c).getSsr_MTG_LOC_LONG());
                rec.getClass_MEETING_PATTERNS().get(0).setSsr_MTG_DT_LONG(pattersList.get(c).getSsr_MTG_DT_LONG());
                rec.getClass_MEETING_PATTERNS().get(0).setSsr_MTG_SCHED_LONG(pattersList.get(c).getSsr_MTG_SCHED_LONG());
                records.add(rec);
            }
        }else{
            records.add(source.get(i));
        }
    }
    return records;

}

2 ответа

В Java, когда вы говорите Object o1= o2; это означает, что вы пытаетесь создать новый объект под названием o1 с таким же адресом o2, Итак, на самом деле у вас есть только один созданный объект и две ссылки на него. Изменение этого объекта отразится на самом объекте, и доступ к нему с любого из адресов объекта приведет к тому же самому.

Вам нужно использовать концепцию Deep Copy делая копию вручную с реальным значением, а не ссылками, как эта статья, чтобы понять это

Я решаю это, передавая пользовательский объект в конструкторе. в приведенном выше коде я был назначен ссылки на другой объект, в связи с тем, что оба указали на то же место Следующий код поможет вам людям.

enter code here 
     private ArrayList<NormalizedClassRecords> reArrangeRecs( ArrayList<Class_Enrollment> source){      
     ArrayList<NormalizedClassRecords> records = new ArrayList<NormalizedClassRecords>();
     NormalizedClassRecords normalizedRec = new NormalizedClassRecords();
    for(int i=0;i<source.size();i++){
        NormalizedClassRecords rec = new NormalizedClassRecords(normalizedRec);
        rec.setCourseId(source.get(i).getCourseId());
        rec.setDescription(source.get(i).getDescription());
        for(int j=0;j<source.get(i).getAdviseclasses().size();j++){
            NormalizedClassRecords rec2 = new NormalizedClassRecords(rec);              
            rec2.setClassnbr(source.get(i).getAdviseclasses().get(j).getClassnbr());
            rec2.setRoomLocation(source.get(i).getAdviseclasses().get(j).getRoomLocation());
            rec2.setSubjectArea(source.get(i).getAdviseclasses().get(j).getSubjectArea());
            rec2.setSection(source.get(i).getAdviseclasses().get(j).getSection());
            rec2.setCatalogNbr(source.get(i).getAdviseclasses().get(j).getCatalogNbr());
            for(int k=0;k<source.get(i).getAdviseclasses().get(j).getMeetingPat().size();k++){
                NormalizedClassRecords rec3 = new NormalizedClassRecords(rec2);
                rec3.setInstructorName(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getInstructorName());
                rec3.setMeetingStartTime(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getMeetingStartTime());
                rec3.setMeetingEndTime(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getMeetingEndTime());
                rec3.setStartDate(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getStartDate());
                rec3.setEndDate(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getEndDate());
                rec3.setMonday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getMonday());
                rec3.setTuesday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getTuesday());
                rec3.setWednesday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getWednesday());
                rec3.setThursday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getThursday());
                rec3.setFriday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getFriday());
                rec3.setSaturday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getSaturday());
                rec3.setSunday(source.get(i).getAdviseclasses().get(j).getMeetingPat().get(k).getSunday());             
                records.add(rec3);
            }
        }
    }
    return records;
}
Другие вопросы по тегам