user1398739
user1398739

Reputation: 216

ArrayLists pointing same object or data in Android

I have two object of arraylist having same type. Want to copy the data of one to an other by mading necessary changes. But this changes effect both of my objects. following is the code.

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;

}

Upvotes: 0

Views: 103

Answers (2)

user1398739
user1398739

Reputation: 216

I solve it by passing custom object in constructor. in above code i was assign the references to other object, due to that both pointed at same location. Following code will help you people.

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

Upvotes: 0

Sami Eltamawy
Sami Eltamawy

Reputation: 10009

In Java, when you say Object o1= o2; thats mean that you are trying to make a new object called o1 that has the same address of o2. SO , you actually have only one object created and two reference on it. Modifying this object will reflect on the object itself and accessing it from any of the object addresses will result the same.

You need to use the concept of Deep Copy by doing the copy manually with the real value not the references as this Article to understand it

Upvotes: 1

Related Questions