Java:创建一个getter函数,它从数组列表中返回一个迭代器

时间:2017-10-25 00:07:53

标签: java arraylist iterator getter

我有一个名为User的类我有一个名为UserGroup的类(用户的arrayList),其中包含以下内容:

变量:

private ArrayList<User> users;
private Iterator<User> userIterator;

构造

public UserGroup(){
    this.users = new ArrayList<>();
}

我正在努力让以下工作:

public Iterator<User> getUserIterator(){
    userIterator = users.iterator();
    return userIterator;
}

我希望它返回一个迭代器,我可以通过在以下上下文中使用它来迭代UserGroup,例如:

while(groupOfUsers.getUserIterator().hasNext()) {
        System.out.println(groupOfUsers.getUserIterator().next());
    }

这导致了一些可怕的无限循环,老实说,我甚至不明白我的getter方法在这一点上返回了什么。 (java.util.ArrayList$Itr@74a14482)

如何帮助我了解如何创建一个可以返回迭代器的getter,我可以用来迭代任何UserGroup,这将是非常感激的。

3 个答案:

答案 0 :(得分:2)

不要将Iterator存储为成员变量。每次需要迭代循环时都会创建Iterator,并使用该本地实例执行此操作。同一列表中的多个迭代器可以同时使用。所以没有必要将它存储在对象中。

删除此行..

private Iterator<User> userIterator; // not needed. bad.

然后将您的getUserIterator()方法更改为此...

public Iterator<User> getUserIterator(){
   return users.iterator();
}

然后像这样使用返回的实例。但是不要再次调用getUserIterator,因为它会在列表的开头返回一个新的Iterator<User> iterator = groupOfUsers.getUserIterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } 。 (这是无限循环的原因)

for (User user : groupOfUsers) {
     System.out.println(user);
}

作为高级步骤,您可以像这样使用增强型for循环。

Iterable

但仅当您使groupOfUsers类实现getUserIterator接口时。并将iterator()方法的名称更改为public class GroupOfUsers implements Iterable<User> { private ArrayList<User> users; public Iterator<User> iterator(){ return users.iterator(); } // etc..

string

答案 1 :(得分:1)

首先将迭代器分配给变量:

Iterator<User> it = groupOfUsers.getUserIterator();
while(it.hasNext()) {
    System.out.println(it.next());
}

否则,每次调用groupOfUsers.getUserIterator()时,您都在创建一个新的迭代器(指向列表的开头) - 如果列表不是空的,groupOfUsers.getUserIterator().hasNext()将始终返回真。

答案 2 :(得分:0)

你的傻瓜很好。问题在于如何使用返回的迭代器。

while(groupOfUsers.getUserIterator().hasNext()) 

上面的代码将尝试在每次迭代开始时获取一个新的迭代器,因此如果用户组不为空,则循环条件将始终为true,并且您具有无限循环。

改为

Iterator<User> iter = groupOfUsers.getUserIterator();
while (iter.hasNext()) System.out.println(iter.next());

或者,如果您只想对组中的每个用户执行某些操作并使用Java 8.您可以使用foreach参数提供Consumer<User>方法。 Iterator可能允许客户从列表中删除元素,有时您不希望这种情况发生。

public void foreachUser(Consumer<? super User> consumer) {
    users.forEach(consumer);
}

groupOfUsers.foreachUser(System.out::println);