2010-08-12 465 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