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);