2010-08-12 462 views
1

我正在研究一個Java Web應用程序,並且對我的HTML表格中的循環有以下要求。我有一個while循環內嵌套for循環(都執行相同的#次,例如說3)。在while循環中嵌套循環 - Java

我的代碼看起來是這樣的:現在

<table> 
<thead>...</thead> 
<tbody> 

    if (patcases != null && patcases.size() > 0) { 
       Iterator itr1 = patcases.iterator(); 
       while (itr1.hasNext()) { 
        ..some code here.. 

        System.out.println("DA Email from webpage..."+da.getEmail()); 
         int rCount = 0; 
     <tr>     
         for(int i=0;i<passedValues.length; i++){ 

         ...some code here.. 
     </tr> 

         System.out.println("Printed row..." +rCount); 
       rCount ++; 
} /*closing of for loop */ 
}/*closing of while loop */ 
}/* closing of if loop */ 
</tbody> 
</table> 

,這種類型的循環結構的,我讓我的控制檯上執行以下操作:從網頁

DA電子郵件... ABC @ ABC。 COM
印刷行... 0
印刷行... 1
印刷行...從網頁2
DA電子郵件... [email protected]
小學nted行... 0
印刷行... 1
印刷行...從網頁2
DA電子郵件... [email protected]
印刷行... 0
印刷行.. 0.1
印刷行... 2

但輸出我想要的類型是,東西如下:從網頁
DA電子郵件... [email protected]
印刷行... 0
DA網頁的電子郵件地址... [email protected]
印刷行...從網頁1
DA電子郵件... [email protected]
印刷行... 2

我怎麼會去這樣做呢?
任何幫助將不勝感激。

+1

看起來不像java(有HTML標籤插入)...你能詳細說明你的編程環境嗎? – 2010-08-12 16:27:49

+1

看起來你只需要1個循環。 – jjnguy 2010-08-12 16:28:13

+1

和他們關閉!最初他們是脖子和頸部。這將成爲一場偉大的比賽! – jjnguy 2010-08-12 16:31:37

回答

9

它看起來像你想並行迭代

簡單地做這樣的事情:

Iterator<?> iter1 = ...; 
Iterator<?> iter2 = ...;    // or: int index = 0; 

while (iter1.hasNext() && 
      iter2.hasNext()) {  // or: index < MAX 

    Object item1 = iter1.next(); 
    Object item2 = iter2.next();  // or: index++; 

    doSomething(item1, item2);  // or: doSomething(item1, index); 

} 

// perhaps additional handling if one ran out before the other 

注意,如果可能的話,那麼你應該使用參數化類型,而不是原始類型(有效的Java第二版,第23項:不要使用原始類型在新代碼)。

+1

這幾乎總是一個代碼異味指向創建一個包含兩個相關信息的類並將該類的對象存儲在一個集合中。 – 2010-08-12 16:42:10

+0

@Mark:良好的洞察力,但在語言指南(http://download-llnw.oracle.com/javase/1.5.0/docs/guide/language/foreach)中提到並行迭代(作爲for-each的限制) .html)和_Effective Java第2版,第46項:優先選擇每個循環以傳統for loops_。 – polygenelubricants 2010-08-12 16:52:31

+1

當然,但這並不能將其作爲一個概念來推廣。我並不是想說你錯了,或者沒有用於並行迭代的有效用法。一個完全有效的用法是檢查兩個集合的順序敏感的相等性。但總的來說,如果我在代碼中看到它,我正在審查它,它將成爲一個大紅旗,因爲通常不會使用並行數據結構來無意創建類型。 – 2010-08-12 17:34:53

2

在我看來,你根本不需要嵌套for循環。你只是想它獲取的while循環遞增計數器:並不意味着「交錯for循環」

if (patcases != null && patcases.size() > 0) { 
    Iterator itr1 = patcases.iterator(); 
    int index = 0; 
    while (itr1.hasNext()) { 
     ..some code here.. 
     System.out.println("DA Email from webpage..."+da.getEmail()); 
     if (index < passedValues.length) { 
      System.out.println("Printed row..." + index); 
     } else { 
      // Hmm, didn't expect this... 
      // (Throw exception or whatever) 
     } 
     index++; 
    } 
    if (index != passedValues.length) { 
     // Hmm, didn't expect this... 
     // (Throw exception or whatever) 
    } 
} 
+0

您應該在'Printed row ...'語句中將'rCount'更改爲'index'。 – 2010-08-12 16:33:38

+0

@亞歷山大:謝謝,修正。 – 2010-08-12 16:35:37

+0

你在if()語句中有i ++,我假設它是在if循環的末尾說出i ++,但是使用這個代碼,我得到了這個foll:o/p DA從webpage ... abc @ abc.com 打印的行... 0 DA網頁的電子郵件... [email protected] 打印的行... 0 DA網頁的電子郵件... [email protected] 打印的行... 0 – Pritish 2010-08-12 16:47:39

0

「嵌套for循環」。例如,他說:

for (i = 0; i < 3; i++) { 
    print("i: " + i); 

    for (j = 0; j < 3; j++) 
     print("\tj: " + j); 
} 

打印如下:

i: 0 
    j: 0 
    j: 1 
    j: 2 
i: 1 
    j: 0 
    j: 1 
    j: 2 
i: 2 
    j: 0 
    j: 1 
    j: 2 

你似乎要的是:

i: 0 
    j: 0 
i: 1 
    j: 1 
i: 2 
    j: 2 

代替嵌套for循環,你只使用一個單獨的計數器在同一個循環中:

j = 0; 

for (i = 0; i < 3; i++) { 
    print("i: " + i); 

    print("\tj: " + j); 
    j++; 
} 
+0

爲什麼還要在最後一個例子中用'j'計數器,按照定義,你希望它始終與'i'相同? – 2010-08-12 16:39:36

+0

可以在'for'語句中加入'j',如下所示:'for(i = 0,j = 0; i <3; i ++,j ++){' – 2010-08-12 16:53:48

+0

@Andrzej因爲在上面的例子中他不是在兩種情況下處理數字。一個是可迭代的,另一個是數組的索引。這說明了同時迭代兩個不同的值(他將用'while(itr.hasnext())')替換'for'循環。 – corsiKa 2010-08-12 17:58:24