Java - 迭代ArrayList的问题

时间:2010-03-16 13:41:25

标签: java collections iterator

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

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

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

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

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

到目前为止我尝试了什么;

  • 如果bokArr (ArrayList)为空,则进行测试,但不是。它里面有4个物体。

  • 返回toString()的{​​{1}}方法,其结果如下:

  

java.util.AbstractList$Itr@173a10f //< - 不确定这是否与任何内容相关

  • itr< - //似乎返回数组中的第一个对象,这有意义吗?

7 个答案:

答案 0 :(得分:13)

引用的代码无法编译,你遗漏了几个声明。但我认为我得到了主旨。

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

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

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

为你迭代收集(在本例中为list)。

答案 1 :(得分:7)

你只是忘了“移动”到下一个元素:

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
}

答案 2 :(得分:5)

为什么不这样迭代:

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

答案 3 :(得分: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无效。

答案 4 :(得分:2)

试试这个:

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

你实际上没有迭代它。请检查下一步。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

  

返回itr.next()。toString(); &lt; - //似乎返回数组中的第一个对象,这有意义吗?

是的,这是有道理的。如果您要遍历所有项目,则需要致电itr.hasNext() ,然后致电itr.next()。但是,如果在循环中执行return itr.next().toString(),它会在第一次迭代时缩短循环次数,并立即从该方法返回。所以,请选择cletus said

相关问题