【问题标题】:Nested for loop inside a while loop - Java在while循环中嵌套for循环 - Java
【发布时间】:2010-08-13 00:48:37
【问题描述】:

我正在开发一个 Java Web 应用程序,并且对于在我的 HTML 表中循环有以下要求。

我在 while 循环中有一个嵌套的 for 循环(都执行相同的 # 次,例如 3)。

我的代码如下所示:

<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 电子邮件...xyz@xyz.com
打印行...0
打印行...1
印刷行...2
来自网页的 DA 电子邮件...123@123.com
打印行...0
打印行...1
打印行...2

但我想要的输出类型如下:
来自网页的 DA 电子邮件...abc@abc.com
打印行...0
来自网页的 DA 电子邮件...xyz@xyz.com
打印行...1
来自网页的 DA 电子邮件...123@123.com
打印行...2

我该怎么做呢?
任何帮助将不胜感激。

【问题讨论】:

  • 这看起来不像 java(散布着 HTML 标签)...你能详细说明你的编程环境吗?
  • 看起来你只需要 1 个循环。
  • 他们走了!!最初它们是并驾齐驱的。这将成为一场伟大的比赛!
  • 不要在新代码中使用原始类型:stackoverflow.com/questions/2770321/…

标签: java loops


【解决方案1】:

看起来你想要并行迭代

只需执行以下操作:

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

请注意,如果可能,您应该使用参数化类型而不是原始类型(Effective Java 2nd Edition,第 23 条:不要在新代码中使用原始类型)。

【讨论】:

  • 这几乎总是一种代码异味,指向创建一个包含相关信息的类并将该类的对象存储在单个集合中。
  • @Mark:很好的洞察力,但在语言指南 (download-llnw.oracle.com/javase/1.5.0/docs/guide/language/…) 和 Effective Java 2nd Edition, Item 46: Prefer for 中都提到了并行迭代(作为 for-each 的限制) -each 循环到传统的 for 循环.
  • 当然可以,但这并不意味着它是一个概念。我并不是想说你错了,或者说并行迭代没有有效的用途。一种完全有效的用途是检查两个集合的顺序敏感相等性。但总的来说,如果我在我正在审查的代码中看到它,那将是一个很大的危险信号,因为并行数据结构通常用于无知创建类型。
【解决方案2】:

在我看来,您根本不想要嵌套的 for 循环。您只需要一个在 while 循环中递增的计数器:

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)
     }
 }

【讨论】:

  • 您应该在Printed row... 语句中将rCount 更改为index
  • 您在 if() 语句中有 i++,我假设在 if 循环结束时说 i++,但是使用此代码,我得到以下信息:o/p DA 电子邮件来自网页...abc@abc.com 打印的行...0 来自网页的 DA 电子邮件...xyz@xyz.com 打印的行...0 来自网页的 DA 电子邮件...123@123.com 打印的行... 0
  • @Pritish:Doh - "i++" 根本不应该存在。不过,它不应该多次打印“第 0 行”。
  • 抱歉,我会在导致问题的 while 循环()中声明 int index = 0。已经解决了。感谢您的帮助!
【解决方案3】:

“嵌套的 for 循环”并不意味着“交错的 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++;
}

【讨论】:

  • 为什么要在最后一个示例中使用j 计数器,根据定义,您希望它始终与i 相同?
  • 可以在for语句中加入j,像这样:for (i = 0, j = 0; i &lt; 3; i++, j++) {
  • @Andrzej 因为在上面的示例中,他在这两种情况下都没有处理数字。一个是可迭代的,另一个是数组的索引。这说明了同时迭代两个不同的值(他会将for 循环替换为while(itr.hasnext()))。
猜你喜欢
  • 2023-03-02
  • 2020-10-09
  • 2013-10-26
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多