【问题标题】:Java - problems iterating through an ArrayListJava - 遍历 ArrayList 的问题
【发布时间】:2010-03-16 13:41:24
【问题描述】:

好的,所以我有一个ArrayList (arrBok),其中充满了book 对象(代码是挪威语,所以请不要注意)。我想创建一个公共方法,它遍历 `ArrayList' 中的所有对象。

当我执行代码时,它似乎只是在无限循环中运行,没有产生任何返回值。

这是代码的相关部分(我希望,因为涉及到其他几个类);

public String listAll()
{
    itr = arrBok.iterator();
    while (itr.hasNext())
    {
        i++;
    }
    return "lol";
}

这段代码没有任何用处,但我只是想看看它是否可以成功地迭代它。

到目前为止我已经尝试过什么;

  • 测试bokArr (ArrayList) 是否为空,事实并非如此。它里面有 4 个对象。

  • 返回itrtoString()方法,结果如下;

java.util.AbstractList$Itr@173a10f //

  • return itr.next().toString();

【问题讨论】:

  • 您没有在循环中执行“itr.next()”!那是“大声笑”!
  • 我猜你已经知道出了什么问题的答案,为了避免这样的陷阱,你可以使用foreach 构造,它可以从jdk >1.5 获得。你可以做类似for(Book b: arrBook){System.out.println (b);}

标签: java collections iterator


【解决方案1】:

引用的代码无法编译,您缺少几个声明。但我想我明白了要点。

hasNext 告诉您迭代器 具有 下一个值,但不会将您带到它。为此,您可以使用next。所以这是一个无限循环,因为你永远不会调用next

对于任何最新的编译器,您都可以使用更简单的表示法:

for (Object book : arrBok) {
    // ...do something with 'book' (or just increment your counter)...
}

它会为您遍历集合(在本例中为列表)。

【讨论】:

    【解决方案2】:

    您只是忘记“移动”到下一个元素:

    while (itr.hasNext()) {
       // Get next element
       Object o = itr.next();
       // do what you want with your element...
    }
    

    请注意,从 Java 5 开始,您可以使用以下语法对列表进行迭代:

    List<String> myList = getAListOfString();
    for (String s : myList) {
        // Your code
    }
    

    【讨论】:

      【解决方案3】:

      为什么不这样迭代:

      for(Book book :arrBok){
        // do something
      }
      

      【讨论】:

      • 如果您能够使用 Java 5 for-each 循环和泛型,我认为这是最好的方法。
      【解决方案4】:

      您必须致电next():

      public String listAll() {
        itr = arrBok.iterator();
        while (itr.hasNext()) {
          itr.next();
          i++;
        }
        return "lol";
      }
      

      顺便说一句,我强烈建议您采用 Java 编码风格(如在我的示例中,在同一行上使用左大括号)。

      您可以使用Iterator,但通常并没有多大意义。从 Java 5 开始,您可以这样做:

      public String listAll() {
        for (Object ob : arrBok) {
          i++;
        }
        return "lol";
      }
      

      对于任何List,您总是能够做到这一点:

      public String listAll() {
        for (int i=0; i<arrBok.length(); i++) {
          Object ob = arrBok.get(i);
        }
        return "lol";
      }
      

      这对ArrayList 有效,但对LinkedList 无效。

      【讨论】:

        【解决方案5】:

        试试这个:

        public String listAll()
        {
            itr = arrBok.iterator();
            while (itr.hasNext())
            {
                itr.next();
                i++;
            }
            return "lol";
        }
        

        你实际上并没有迭代它。只需检查下一个。

        【讨论】:

          【解决方案6】:

          确保在循环中调用 itr.next() 以移动到下一个元素。

          此外,i++ 与您的代码无关 - 它只是增加一个未在任何地方使用的变量。

          【讨论】:

            【解决方案7】:

            返回 itr.next().toString();

            是的,这是有道理的。如果你想遍历所有项目,你需要调用itr.hasNext()然后调用itr.next()。但是,如果您在循环内执行return itr.next().toString(),它会在第一次迭代时缩短循环,并立即从该方法返回。所以,喜欢cletus said

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-12-26
              • 2014-10-21
              • 2015-02-13
              • 2013-04-05
              • 1970-01-01
              • 2015-11-28
              • 2013-05-05
              • 2014-03-22
              相关资源
              最近更新 更多