我正在尝试使用iterator
来迭代列表,因为某些原因它会无限期地进行。
这是代码
{
List<Person> Person1 = new ArrayList<Person>();
Person p1 = new Person("Name1", "Virginia");
Person1.add(new Person("Nae2", "Virginia"));
printerlist(Person1);
printerlist(p1);
}
private static void printerlist(List<Person> p) {
/*
* print the list
*/
while (p.iterator().hasNext()) {
System.out.println(p.iterator().next().getCity());
}
}
答案 0 :(得分:5)
想想这条线在做什么:
while (p.iterator().hasNext()) {
每次要评估条件时,您都会获得一个之前从未接触过的 new 迭代器对象。
由于您从未使用过新迭代器中的任何内容,hasNext()
将始终为真。
同样,在下一行:
System.out.println(p.iterator().next().getCity());
您正在获取另一个新的迭代器,因此在其上调用next()
将始终返回列表中的第一项。
为了正确循环,您需要为整个循环重用相同的迭代器。您可以通过显式创建和使用单个迭代器来执行此操作:
Iterator<Person> itr = p.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().getCity());
}
或者您可以使用enhanced for-loop之类的东西让Java隐式创建和管理迭代器:
while (Person person : p) {
System.out.println(person.getCity());
}
在功能上等同于
for (Iterator<Person> itr = p.iterator(); itr.hasNext();) {
Person person = itr.next();
System.out.println(person.getCity());
}
答案 1 :(得分:4)
p.iterator()
为列表p
创建一个新的迭代器。所以光标总是在收集的开始。
试试这个:
Iterator<Person> it = p.iterator();
while (it.hasNext()) {
System.out.println(it.next().getCity());
}
答案 2 :(得分:3)
每次拨打p.iterator()
,您都会从第一个元素开始获得一个新的Iterator。相反,您应该将返回的迭代器分配给临时变量。
答案 3 :(得分:0)
您不需要使用current_user.company_records
这将返回迭代类型(iterator()
)的对象。它用于
一个接口(Java Collections的一部分),它返回传递给它的类型。 Iterator用于遍历元素列表,并在必要时删除元素。
我们可以Iterator<T>
iteration()
来自p
并使用通用Iterator
将其分配到<Person>
。
您需要为Person对象类型创建Iterator<>
,然后只需要使用while(p.hasNext()) {
如果您使用的是Java 1.5或更高版本,则可以使用为每个(增强型)循环迭代对象(列表)类型。在1.5 Iterator 用于迭代列表之前。注意迭代器仍在使用。
如果您想了解iterator()
有关此java doc和this或stackoverflow question的更多信息。