Head First Java Puzzle4 (Chapter 4, pg 91) Explanation



下面是主题谜题的解决方案和输出,我很难理解它是如何工作的。

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。

最后但并非最不重要的一点是,这本书要求你在纸上做练习并非没有道理。它导致大量的写作,但也理解代码在每一行上的作用。

最新更新