我正在尝试在持有数组的类上实现可迭代。该数组最多可容纳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()方法。
我不确定您是怎么想的,但是我有一些建议。
您需要了解或要做的某些事情(假设您没有)。>>
为您的迭代器创建一个private inner class
。它更干净,可以在调用它时重新初始化一些重要的值。
在iterator()
方法中,返回私有迭代器类的实例。
不要递增current
。在您的迭代器类中创建一个副本并使用它。这样,您每次都将迭代相同的值,因为每次都将从相同的current值开始(即假设您的数组不变)。另外,如果不执行此操作,则在单击null
时,下次尝试迭代时,您将为null,并且不会打印任何值。
在hasNext()
方法中添加其他测试。如果您的内部数组已满,它将继续循环,因为找不到null
值来终止迭代,因此hasNext()
始终返回true。
并且使用for (T element : set)
使用for循环调用迭代器。