Java-迭代器和可迭代

问题描述 投票:-1回答:1

我正在尝试在持有数组的类上实现可迭代。该数组最多可容纳6个项目。另外,它是一个循环缓冲区,因此看起来像[x] [] [] [y] [x] [x],其中“ y”是起始索引。

如果使用迭代器遍历元素,则仅打印出实际包含值的元素。我的问题是,如果使用for-each循环,它将打印出所有元素。

这是我的Iterator类:

   int current = startIndex;

   @Override
    public boolean hasNext() {
        return elements[current] != null;
    }

    @Override
    public T next() {

        T t = (T) elements[current];

        current = (current+1) % MAX_SET_LENGTH;

        return t;
    }

这是我正在使用的两个循环:

// This works fine
    Iterator it = set.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }

// This goes through all the elements, even if null (so hasNext() should return false)
    for (T element: set.getSet()) {
        System.out.println(element);
    }

是因为数组?我希望for-each循环不将其视为包含6个插槽的数组,而是使用我的hasNext()和next()方法。

java foreach iterator iterable
1个回答
0
投票

我不确定您是怎么想的,但是我有一些建议。

您需要了解或要做的某些事情(假设您没有)。>>

  1. 为您的迭代器创建一个private inner class。它更干净,可以在调用它时重新初始化一些重要的值。

  2. iterator()方法中,返回私有迭代器类的实例。

  3. 不要递增current。在您的迭代器类中创建一个副本并使用它。这样,您每次都将迭代相同的值,因为每次都将从相同的current值开始(即假设您的数组不变)。另外,如果不执行此操作,则在单击null时,下次尝试迭代时,您将为null,并且不会打印任何值。

  4. hasNext()方法中添加其他测试。如果您的内部数组已满,它将继续循环,因为找不到null值来终止迭代,因此hasNext()始终返回true。

  5. 并且使用for (T element : set)使用for循环调用迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.