下面是主题谜题的解决方案和输出,我很难理解它是如何工作的。
public class Puzzle4 {
public static void main(String[] args) {
Puzzle4b[] obs = new Puzzle4b[6];
int y = 1;
int x = 0;
int result = 0;
while (x<6) {
obs[x] = new Puzzle4b();
obs[x].ivar = y;
y = y*10;
x = x+1;
}
x = 6;
while (x>0) {
x = x-1;
result = result + obs[x].doStuff(x);
}
System.out.println("result " + result);
}
}
class Puzzle4b {
int ivar;
public int doStuff(int factor) {
if (ivar>100) {
return ivar*factor;
} else {
return ivar*(5-factor);
}
}
}
输出:
result 543345
据我了解,第一个 While 循环将运行 6 次(从 x==0 到 x==5)。 y 变量,反过来是"ivar",值为 1,000,000(我认为这就是我出错的地方,但我会继续希望得到纠正)。
第二个 While 循环对我来说有点令人困惑。 它将运行 6 次,循环的第二行将"x"值传递给 doStuff 方法,以便它返回一个值。 我为结果得出的数字与实际结果不匹配。
这里的任何帮助将不胜感激。 如果我考虑的方式错误,请告诉我。 如果有人想重新格式化我的代码以更紧密地与行业标准保持一致,从一开始就学习好习惯会很棒!
这段代码'
obs[x].ivar = y;
y = y*10;
将导致第一个 ivar = y = 1,然后是多个 y所以它将是 {1 - 10 - 100 - 1,000 - 10,000 - 100,000}
第二个循环 x 将是 { 5, 4, 3, 2, 1, 0 }所以它会像这样开始 结果 = 结果+obs[5].doStuff[5];
我想元素 1 中的 X 将等于元素 5 中的 y 的所有误解元素 2 中的 x 将等于元素 4 中的 y,依此类推"因为 x 在递增,y 在递减
所以它会像这样
(ivar > 100 )
ivar * (5-factor)
x[3] * y[2] = 1000 * (5-2) = 3000
x[4] * y[1] = 10000 * (5-1) = 40000
x[5] * y [0] = 100000 * (5-0) = 500000
then (ivar < 100)
ivar * factor
x[1] * y [5] = 1 * 5 = 5
x[2] * y [4] = 10 * 4 = 40
x[3] * y [3] = 100 * 3= 300
然后,如果您将所有数字相加,您将获得输出
在第二个 while 循环中, 而 (x>0) 将给出 543340相反,While (x>=0) 应该给出所需的输出如果我没记错的话
对我来说,分解这一点的一种简单方法是逐步查看并准确查看值的来源。 我在下面完成了此操作并将其注释到代码中。
public class Puzzle4 {
public static void main(String[] args) {
Puzzle4b[] obs = new Puzzle4b[6];
int y = 1;
int x = 0;
int result = 0;
// let's break out of the loops
obs[0] = new Puzzle4b();
obs[0].ivar = 1;
obs[1] = new Puzzle4b();
obs[1].ivar = 10;
obs[2] = new Puzzle4b();
obs[2].ivar = 100;
obs[3] = new Puzzle4b();
obs[3].ivar = 1000;
obs[4] = new Puzzle4b();
obs[4].ivar = 10000;
obs[5] = new Puzzle4b();
obs[5].ivar = 100000;
// ivar's = 1, 10, 100, 1000, 10000, 100000
result = result + obs[5].doStuff(5); // 0 + (5 * 100000)
result = result + obs[4].doStuff(4); // 500000 + (4 * 10000)
result = result + obs[3].doStuff(3); // 540000 + (3 * 1000)
result = result + obs[2].doStuff(2); // 543000 + ((5 - 2) * 100)
result = result + obs[1].doStuff(1); // 543300 + ((5-1) * 10)
result = result + obs[0].doStuff(0); // 543340 + ((5-0) * 1)
// result = 543345
}
System.out.println("result " + result);
}
}
class Puzzle4b {
int ivar;
public int doStuff(int factor) {
if (ivar>100) {
return ivar*factor;
} else {
return ivar*(5-factor);
}
}
}
希望这能帮助您理解该示例。
关键是要了解每个循环的作用。第一个只不过是为每个数组对象的 ivar 变量赋值。您可以使用"x"值作为索引来执行此操作。
第二个,您仍然从当前"x"变量中获取索引。然后,您需要记住此索引的 ivar 值是多少。考虑到这一点,您将能够分别了解doStuff方法的什么条件是真的以及你应该使用什么表达式。
此外,您必须记住"结果"变量在每次循环迭代中获得的值。像第一次迭代结果 = 500 000。那么第二个将是结果 = 500 000 + doStuff。
最后但并非最不重要的一点是,这本书要求你在纸上做练习并非没有道理。它导致大量的写作,但也理解代码在每一行上的作用。