好的,我有一个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
< - //似乎返回数组中的第一个对象,这有意义吗?答案 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。