我正在做健身功能的实验室。问题是我正在制作一个SmallChange()函数来执行它所说的内容,令人烦恼的是它似乎更新了你给它的变量,而不应该这样做。
以下是完整课程的副本:https://gist.github.com/1710367
第38行是问题界线。
以下是功能。当我将solution
作为输入时,它会更新solution
并进行较小的更改,但我无法弄清楚如何或为什么。
任何人都知道我哪里出错了?它开始伤害我的大脑。
// Edits either the angle or velocity of our solution
// by a small amount (about 1% of the diffrence between max and min)
public static Double[] SmallChange(Double[] sol) {
// Pick a 0 or 1
switch (r.nextInt(2)) {
case 1: // Changing the angle
// The angle change amount
Double angle = (angleLimits[1] - angleLimits[0]) * 0.01;
// Make the change, either + or -
if (r.nextInt(2) == 0) {
sol[0] += angle;
} else {
sol[0] -= angle;
}
// Check it's within the limits
if (sol[0] > angleLimits[1]) {
sol[0] = angleLimits[1];
} else if (sol[0] < angleLimits[0]) {
sol[0] = angleLimits[1];
}
break;
case 0: // Changing the velocity
// The velocity change amount
Double velocity = (velocityLimits[1] - velocityLimits[0]) * 0.01;
// Make the change, either + or -
if (r.nextInt(2) == 0) {
sol[1] += velocity;
} else {
sol[1] -= velocity;
}
// Check it's within the limits
if (sol[1] > velocityLimits[1]) {
sol[1] = velocityLimits[1];
} else if (sol[1] < velocityLimits[0]) {
sol[1] = velocityLimits[1];
}
break;
}
return sol;
}
答案 0 :(得分:8)
在Java中,所有内容都是按值传递的 - 但该值始终是基元或引用。
因此,任何数组变量的值都是数组对象的引用。当您将该变量用作参数时,值(引用)最终将作为参数的初始值。它仍然将相同的数组 object 称为调用者的变量 - 因此调用者将看到对数组所做的任何更改。
所以只是为了澄清一下,你的陈述不正确:
恼人地似乎更新你给它的变量,当它不应该
它根本没有改变变量的值:调用代码中的变量仍具有与之前相同的值,即对同一数组的引用。只是该方法正在改变数组的内容。
这就像在一张纸上复制你的地址,然后把它交给某人:他们不能改变你住的地方,但他们可以改变你前门的颜色。
现在,解决问题......
如果要克隆数组,则必须明确地执行此操作。例如:
public static Double[] smallChange(Double[] sol) {
Double[] ret = (Double[]) sol.clone();
// Now work on ret instead of sol, and return ret at the end
你可以重新分配给sol
,但我个人不会。
请注意,您可能还想使用double[]
代替Double[]
。