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