【问题标题】:Iterating over collections in Java迭代Java中的集合
【发布时间】:2015-08-17 02:16:35
【问题描述】:

下面的代码给出了一个异常,但是我不明白为什么。

List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();

// BROKEN - throws NoSuchElementException!
for (Iterator i = suits.iterator(); i.hasNext(); )
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(i.next(), j.next()));

解决方案显然如下:

// Fixed, though a bit ugly
for (Iterator i = suits.iterator(); i.hasNext(); ) {
    Suit suit = (Suit) i.next();
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(suit, j.next()));
}

我明白为什么该解决方案有效,但为什么第一个示例无效?

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    好吧,我明白为什么了!这仅仅是因为 i.next() 由于嵌套的 for 循环而最终被调用了太多次。对于每组“j”次迭代,它只意味着访问一套西装,同样的西装。因此,i.next() 在嵌套循环被调用,以防止套装每次都改变。

    【讨论】:

      【解决方案2】:

      您忘记在第一个块中使用方括号 {}

      List suits = ...;
      List ranks = ...;
      List sortedDeck = new ArrayList();
      
      // BROKEN - throws NoSuchElementException!
      for (Iterator i = suits.iterator(); i.hasNext(); ) {
          for (Iterator j = ranks.iterator(); j.hasNext(); )
              sortedDeck.add(new Card(i.next(), j.next()));
      }

      【讨论】:

      • 我希望你意识到,如果里面只有一个语句,完全可以省略大括号!
      猜你喜欢
      • 2011-04-25
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多