Java:创建一个 getter 函数,其中 returns 一个数组列表中的迭代器
Java: Creating a getter function which returns an iterator from an array list
我有一个名为 class 的用户 我有一个名为 class 的用户组(用户数组列表),其中包含以下内容:
变量:
private ArrayList<User> users;
private Iterator<User> userIterator;
构造函数:
public UserGroup(){
this.users = new ArrayList<>();
}
我正在尝试让以下内容起作用:
public Iterator<User> getUserIterator(){
userIterator = users.iterator();
return userIterator;
}
我希望它 returns 是一个迭代器,我可以通过在以下上下文中使用它来迭代 UserGroup,例如:
while(groupOfUsers.getUserIterator().hasNext()) {
System.out.println(groupOfUsers.getUserIterator().next());
}
这导致了一些可怕的无限循环,老实说,此时我什至不明白我的 getter 方法返回了什么。 (java.util.ArrayList$Itr@74a14482)
任何帮助我理解我将如何实际着手创建一个 getter 的工作,返回一个我可以用来迭代任何用户组的迭代器,我将不胜感激。
首先将迭代器赋给一个变量:
Iterator<User> it = groupOfUsers.getUserIterator();
while(it.hasNext()) {
System.out.println(it.next());
}
否则,每次调用 groupOfUsers.getUserIterator()
时都会创建一个新的迭代器(指向列表的开头)- 如果列表不为空,groupOfUsers.getUserIterator().hasNext()
将始终 return 是的。
不要将 Iterator
存储为成员变量。 Iterator
是您每次需要迭代循环时创建的东西,并且您使用该本地实例来执行此操作。同一列表中的多个迭代器可以同时使用。所以不需要在对象中存储。
删除这一行..
private Iterator<User> userIterator; // not needed. bad.
然后将您的 getUserIterator()
方法更改为此...
public Iterator<User> getUserIterator(){
return users.iterator();
}
然后像这样使用 returned 实例。但是不要再次调用 getUserIterator
,因为它会 return 你一个新的,在列表的开头。 (这是无限循环的原因)
Iterator<User> iterator = groupOfUsers.getUserIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
作为高级步骤,您可以像这样使用增强的 for 循环..
for (User user : groupOfUsers) {
System.out.println(user);
}
但前提是您让 groupOfUsers class 实现 Iterable
接口。并将 getUserIterator
方法的名称更改为 iterator()
public class GroupOfUsers implements Iterable<User> {
private ArrayList<User> users;
public Iterator<User> iterator(){
return users.iterator();
}
// etc..
你的 getter 没问题。问题在于如何使用返回的迭代器。
while(groupOfUsers.getUserIterator().hasNext())
上面的代码会在每次迭代的开始尝试获取一个新的迭代器,所以如果用户组不为空,循环条件永远为真,你就有了无限循环。
改为这样做
Iterator<User> iter = groupOfUsers.getUserIterator();
while (iter.hasNext()) System.out.println(iter.next());
或者如果您只想对组中的每个用户做一些事情并且正在使用 Java 8. 您可以提供一个带有 Consumer<User>
参数的 foreach
方法。 Iterator
可能允许客户端从列表中删除一个元素,有时您不希望这种情况发生。
public void foreachUser(Consumer<? super User> consumer) {
users.forEach(consumer);
}
groupOfUsers.foreachUser(System.out::println);
我有一个名为 class 的用户 我有一个名为 class 的用户组(用户数组列表),其中包含以下内容:
变量:
private ArrayList<User> users;
private Iterator<User> userIterator;
构造函数:
public UserGroup(){
this.users = new ArrayList<>();
}
我正在尝试让以下内容起作用:
public Iterator<User> getUserIterator(){
userIterator = users.iterator();
return userIterator;
}
我希望它 returns 是一个迭代器,我可以通过在以下上下文中使用它来迭代 UserGroup,例如:
while(groupOfUsers.getUserIterator().hasNext()) {
System.out.println(groupOfUsers.getUserIterator().next());
}
这导致了一些可怕的无限循环,老实说,此时我什至不明白我的 getter 方法返回了什么。 (java.util.ArrayList$Itr@74a14482)
任何帮助我理解我将如何实际着手创建一个 getter 的工作,返回一个我可以用来迭代任何用户组的迭代器,我将不胜感激。
首先将迭代器赋给一个变量:
Iterator<User> it = groupOfUsers.getUserIterator();
while(it.hasNext()) {
System.out.println(it.next());
}
否则,每次调用 groupOfUsers.getUserIterator()
时都会创建一个新的迭代器(指向列表的开头)- 如果列表不为空,groupOfUsers.getUserIterator().hasNext()
将始终 return 是的。
不要将 Iterator
存储为成员变量。 Iterator
是您每次需要迭代循环时创建的东西,并且您使用该本地实例来执行此操作。同一列表中的多个迭代器可以同时使用。所以不需要在对象中存储。
删除这一行..
private Iterator<User> userIterator; // not needed. bad.
然后将您的 getUserIterator()
方法更改为此...
public Iterator<User> getUserIterator(){
return users.iterator();
}
然后像这样使用 returned 实例。但是不要再次调用 getUserIterator
,因为它会 return 你一个新的,在列表的开头。 (这是无限循环的原因)
Iterator<User> iterator = groupOfUsers.getUserIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
作为高级步骤,您可以像这样使用增强的 for 循环..
for (User user : groupOfUsers) {
System.out.println(user);
}
但前提是您让 groupOfUsers class 实现 Iterable
接口。并将 getUserIterator
方法的名称更改为 iterator()
public class GroupOfUsers implements Iterable<User> {
private ArrayList<User> users;
public Iterator<User> iterator(){
return users.iterator();
}
// etc..
你的 getter 没问题。问题在于如何使用返回的迭代器。
while(groupOfUsers.getUserIterator().hasNext())
上面的代码会在每次迭代的开始尝试获取一个新的迭代器,所以如果用户组不为空,循环条件永远为真,你就有了无限循环。
改为这样做
Iterator<User> iter = groupOfUsers.getUserIterator();
while (iter.hasNext()) System.out.println(iter.next());
或者如果您只想对组中的每个用户做一些事情并且正在使用 Java 8. 您可以提供一个带有 Consumer<User>
参数的 foreach
方法。 Iterator
可能允许客户端从列表中删除一个元素,有时您不希望这种情况发生。
public void foreachUser(Consumer<? super User> consumer) {
users.forEach(consumer);
}
groupOfUsers.foreachUser(System.out::println);