2010-02-22 57 views
0

我正在研究一些開始Java邏輯,我不知道爲什麼這不起作用。這裏是我做了一個方法:爲什麼我的變量沒有在這些語句中加在一起呢?

private void printSubclassBoxes(){ 
     int coordinateX = ((getWidth() - BOX_WIDTH) /4); 

     for (int i = 0; i < 3; i++){ 

      double coordinateY = (getHeight()/2);  
      GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT); 

      GLabel classLabel = new GLabel ("Program"); 
      double labelCoordinateX = (coordinateX + ((classBox.getWidth()/2) - (classLabel.getWidth()/2))); 
      double labelCoordinateY = (coordinateY + ((classBox.getHeight()/2) + (classLabel.getAscent()/2))); 
      add(classBox); 
      add(classLabel, labelCoordinateX, labelCoordinateY); 
      if (i == 1){ 
      coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2); 
     } 
     if (i == 2){ 
      coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3); 
     } 

     } 

    } 

現在,我敢肯定,有可能是更好的方式來做到這一點,但請 - 我現在沒有在正確的興趣(我想學習而不會spoonfed答案)。我想知道的是爲什麼結尾兩個if語句不像我認爲他們應該那樣工作。

爲了簡單起見,假設

100 = ((getWidth() - BOX_WIDTH) 

int coordinateX = 25; 

我的理解是,int i獲取對第一個if語句和25 + 25這樣的話coordinateX = 50

那麼下一次增加的循環, i = 2 so coordinateX would = 75.

這就是我期待的事情,但事實並非如此。我似乎正在將前兩個盒子直接打印在一起,然後第三個是移動25.

感謝您的幫助球員。現在我明白了這個循環,我繼續前進並以不同的方式解決它。我結束了分配coordinateX另一個變量並用它來添加到末尾:

int coordinateX = ((getWidth() - BOX_WIDTH) /4); 
     int otherCoordinateX = coordinateX; 

     for (int i = 0; i < 3; i++){ 

      double coordinateY = (getHeight()/2);  
      GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT); 

      GLabel classLabel = new GLabel ("Program"); 
      double labelCoordinateX = (coordinateX + ((classBox.getWidth()/2) - (classLabel.getWidth()/2))); 
      double labelCoordinateY = (coordinateY + ((classBox.getHeight()/2) + (classLabel.getAscent()/2))); 
      add(classBox); 
      add(classLabel, labelCoordinateX, labelCoordinateY); 
      coordinateX = otherCoordinateX + coordinateX; 

     } 
+0

如果您重構代碼,它可能是更容易看清問題。你有if語句基於循環的迭代硬編碼。將這些更改爲更簡單的形式可能有助於您排除故障。 – glasnt 2010-02-22 04:37:41

回答

1

第一迭代循環:

  • i = 0
  • coordinateX = 25,符合市場預期。

在的迭代coordinateX到底是更新(自i == 0)。

然後,在迭代:

  • i = 1
  • 但仍coordinateX = 25它沒有更新,因爲。

在第二次迭代coordinateX的端部因爲if i == 1)測試的更新。

第三迭代

  • i = 2
  • 使用的coordinateX新的值,其被設定爲第二次迭代的末端。

解決方案

不改變你的代碼中任何必要途徑,只需更換if (i == 1)通過if (i == 0)if (i == 1)if (i == 2)

編輯:課

for(...) { } declaration中,i < 3試驗在開始每次迭代的檢查,但i++部分稱爲在每次迭代的

+0

啊。我以爲我在被證明不到3之後立即變成了1 ...不是? – Joel 2010-02-22 04:37:09

+0

的確將這些變成了1 == 0和i == 1的伎倆。謝謝! – Joel 2010-02-22 04:39:13

+0

是的,這是正確的!循環邏輯的經典noob - 問題... – ultrajohn 2010-02-22 04:43:12

1

你只是有一個錯誤的循環索引問題。第一次通過你的循環,i0,而不是1。第二次通過,它是1,而不是2。將行if (i == 1)if (i == 2)分別更改爲if (i == 0)if (i == 1)將解決您的問題。儘管如此,這仍然是一種奇怪的方式來完成循環。比較標準的方法是設置一個incrementX變量,然後每次通過循環無條件地添加它。

+0

我還沒有完全想到如何做到這一點,因爲我需要一個價值,減去另一個價值,除以四,然後通過總數... – Joel 2010-02-22 04:41:06

+0

@Joel,是的,所以在循環之前添加'int incrementX = coordinateX',並用'coordinateX = coordinateX + incrementX'替換'if'的東西。 – 2010-02-22 04:53:22

+0

啊 - 知道了...參見上面的代碼。 – Joel 2010-02-22 04:55:01

0

可能看起來像一個蹩腳的答案,但這是我在這些情況下會做的。在循環中放入一堆打印語句時,您可以驗證您得到的輸出是您的期望。如果它不在某個特定的位置,開始嘗試確定原因。

1

由於您希望在「下一次迭代」之前遞增該值,所以應該在第一秒/第二/第三秒之間執行該操作,但是應在循環結束時更新變量coordinateX,以便檢查不同的索引: 01

這是什麼意思?

這工作:

for (int i = 0; i < 3; i++) 
{ 
    /* other part of the loop */ 
    if (i == 0) 
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2); 
    else if (i == 1) 
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3); 
} 

但這個工程太:

for (int i = 0; i < 3; i++) 
{ 
    if (i == 1) 
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2); 
    else if (i == 2) 
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3); 
    /* other part of the loop */ 
} 
+0

我看到我的困惑只是在'我'改變價值的時候嗎? – Joel 2010-02-22 04:44:19

+0

@Joel,每循環塊完成後循環增量'i ++'發生。 – 2010-02-22 04:52:34

+0

太好了。謝謝! – Joel 2010-02-22 04:54:35

相關問題