0

I am using these instructions for the method: A constructor, public ProgrammingTeam( ProgrammingTeam p ), that takes a ProgrammingTeam p as a parameter and constructs a deep copy of p. Don’t just write meets = p.meets;. To make a deep copy, you must call ArrayList’s copy constructor: meets = new ArrayList();.

  public ProgrammingTeam( ProgrammingTeam p ) {
    teamName = p.teamName;
    teamMembers = new String [ p.teamMembers.length ];
    for (int i = p.teamMembers.length - 1; i >= 0; i--) {

    }
    meets = new ArrayList < Competition >();
}

I cannot figure out exactly how I am supposed to compose and then finish the deep copy. I know it is going to need a for loop to actually copy every object but I am at a loss, thanks!

user2272710
  • 1
  • 1
  • 2

3 Answers3

2

Regarding the String array...

Strings are immutable, so it is sufficient to simply copy the array, for example using the Arrays.copyOf() utility method:

teamMembers = Arrays.copyOf( p.teamMembers, p.teamMembers.length );

As for the List, it depends...

If Competition is immutable, use ArrayList's copy constructor:

meets = new ArrayList<Competition>(p.meets);

If Competition is mutable, you need to invoke its copy constructor (defining it if required).

meets = new ArrayList<Competition>();
for (Competition c : p.meets) {
    meets.add(new Competition(c));
}
Bohemian
  • 412,405
  • 93
  • 575
  • 722
0

you need to create a deep copy of all of the ProgrammingTeam parameter p's attributes.

You could do the following:

for(int i = 0; i < p.teamMembers.length -1; i++){
        TeamMember teamMember = new TeamMember();
        // set attributes
        teamMember.setAttribute1(p.teamMembers[i].getAttribute1());
        ...
        teamMember.setAttributeN(p.teamMembers[i].getAttributeN());
         this.teamMembers[i] = teamMember;
 }

Of course, you could simply create a copy constructor for whatever objects are held in the lists that need to be deep copied. The copy constructor would essentially need to accomplish the same sort of thing I described within that for loop.

shaunvxc
  • 182
  • 4
  • 12
0

To make a deep copy of String[] teamMembers use java.util.Arrays.copyOf(teamMembers, teamMembers.length)

As for a deep copy of List<Competition> meets you can do it with new ArrayList<Competition>(meets) but it will only be good if Competition is immutable

Evgeniy Dorofeev
  • 133,369
  • 30
  • 199
  • 275