我有一个名为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,这将是非常感激的。
答案 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);