Java Iterator进入无限循环

时间:2017-04-12 17:37:45

标签: java arraylist

我正在尝试使用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());
    }

}

4 个答案:

答案 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 docthisstackoverflow question的更多信息。