2013-04-12 25 views
0

我正在使用这些指令进行方法: 构造函数public ProgrammingTeam(ProgrammingTeam p),它以编程队列p作为参数并构造p的深层副本。不要只写符合= p.meets ;.为了使一个深拷贝,你必须调用ArrayList中的拷贝构造函数:符合=新的ArrayList ();.在Java中使用构造函数进行深度复制

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

我想不出我究竟应该如何编写,然后完成深拷贝。我知道这将需要一个for循环来实际复制每个对象,但我很茫然,谢谢!

回答

0

您需要创建所有的ProgrammingTeam参数P的属性的深层副本。

你可以做到以下几点:

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

当然,你可以简单地创建任何对象在需要进行深拷贝名单举行了拷贝构造函数。复制构造函数基本上需要完成我在for循环中描述的同样的事情。

0

为了使String[] teamMembers使用java.util.Arrays.copyOf(teamMembers, teamMembers.length)

至于List<Competition> meets了深刻的副本,你可以用new ArrayList<Competition>(meets)做深层复制,但是它只会是一件好事,如果竞争是永恒不变的

2

关于String数组.. 。

字符串是不变的,所以它足以使用Arrays.copyOf()实用方法阵列简单地复制,例如:

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

至于名单,这取决于...

如果Competitionimmutable,使用ArrayList的拷贝构造函数:

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

如果Competition是可变的,你需要调用它的拷贝构造函数(如果需要,定义它)。

meets = new ArrayList<Competition>(); 
for (Competition c : p.meets) { 
    meets.add(new Competition(c)); 
} 
+0

我试过teamMembers建议,但不允许它。可能是因为实际变量是private String [] teamMembers;? – user2272710

+0

你是什么意思“没有允许它”?什么是错误信息? – Bohemian