代码是:
package classes;
public class Test {
private static double mutationRate = 0.5;
public static void main(String[] args) {
Population pop = new Population();
pop.initialise();
Population po = new Population();
po.getIndividusList().add(pop.getFittest());
po.getIndividusList().add(mutate(pop.getIndividusList().get(1)));
}
private static Chromosom mutate(Chromosom l) { // changer les couples d'interventions des parcs)
// loop through genes
Chromosom ch = new Chromosom();
for (int i = 0; i < l.size(); i++)
ch.put(i, l.get(i));
for (int i = 0; i < ch.size(); i++) {
double alea = Math.random() * 13;
int moisIntervention1 = (int) alea;
Intervention interv1 = new Intervention(1, moisIntervention1);
ch.get(i).modInterventions(ch.get(i).intervention2(interv1));
}
return ch;
}
}
问题是我没有更改实例pop,但是当我更改另一个实例po时,pop也会更改。
答案 0 :(得分:1)
java按值传递。
当您拨打此mutate(pop.getIndividusList().get(1))
你正在发送pop的实例,所以它会得到改变。
让pop.getIndividusList().get(1)
以这种方式返回String varibale
String var=pop.getIndividusList().get(1);
然后致电mutate(var)
答案 1 :(得分:0)
我不确定我是否理解这个问题,但我认为您的意思是当您更改人口po
中的项目时,人口pop
中的项目会反映这些更改。< / p>
确实,您的代码的预期行为:要填充po
,您要添加来自pop
- (pop.getFittest, pop.getList.get(1) )
的项目。
但我相信,这些人是对象的实例,因此添加/删除和类似的操作与对象的引用一起工作,而不是对它们的副本。因此,当您有2个对同一个obj的引用时,任何更改都会被镜像。
如果要创建副本,则应通过创建将另一个实例作为参数,实现复制方法或类似内容的构造函数,向po
添加具有相同状态的新对象。 / p>
它应该是这样的:
Population po = new Population();
Individual fittest = pop.getFittest();
Individual poCopy = new Individual();
//ADD CODE HERE TO COPY ALL THE FIELDS FROM fittest TO poCopy
//....
po.getIndividusList().add(poCopy);