我们可以用Java编写自己的迭代器吗?
如果我有一个包含的列表,并且我想编写一个迭代器,以便它迭代以“a”开头的元素,我可以编写自己的迭代器吗?我该怎么做?[alice, bob, abigail, charlie]
如果我有一个包含的列表,并且我想编写一个迭代器,以便它迭代以“a”开头的元素,我可以编写自己的迭代器吗?我该怎么做?[alice, bob, abigail, charlie]
最好的可重用选项是实现接口 Iterable 并重写方法 iterator()。
下面是一个类似 ArrayList 的类实现接口的示例,在该类中,您可以重写方法 Iterator()。
import java.util.Iterator;
public class SOList<Type> implements Iterable<Type> {
private Type[] arrayList;
private int currentSize;
public SOList(Type[] newArray) {
this.arrayList = newArray;
this.currentSize = arrayList.length;
}
@Override
public Iterator<Type> iterator() {
Iterator<Type> it = new Iterator<Type>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < currentSize && arrayList[currentIndex] != null;
}
@Override
public Type next() {
return arrayList[currentIndex++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
return it;
}
}
此类使用泛型实现可迭代接口。考虑到数组中有元素,您将能够获得迭代器的实例,例如,它是“foreach”循环使用的所需实例。
您只需创建迭代器的匿名实例,而无需创建扩展迭代器,并利用 currentSize 的值来验证可以导航数组的位置(假设您创建了一个容量为 10 的数组,但在 0 和 1 处只有 2 个元素)。该实例将具有其所在位置的所有者计数器,您需要做的就是使用 hasNext()(验证当前值是否为空)和 next(),这将返回当前索引的实例。以下是使用此 API 的示例...
public static void main(String[] args) {
// create an array of type Integer
Integer[] numbers = new Integer[]{1, 2, 3, 4, 5};
// create your list and hold the values.
SOList<Integer> stackOverflowList = new SOList<Integer>(numbers);
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(Integer num : stackOverflowList) {
System.out.print(num);
}
// creating an array of Strings
String[] languages = new String[]{"C", "C++", "Java", "Python", "Scala"};
// create your list and hold the values using the same list implementation.
SOList<String> languagesList = new SOList<String>(languages);
System.out.println("");
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(String lang : languagesList) {
System.out.println(lang);
}
}
// will print "12345
//C
//C++
//Java
//Python
//Scala
如果需要,也可以使用迭代器实例对其进行迭代:
// navigating the iterator
while (allNumbers.hasNext()) {
Integer value = allNumbers.next();
if (allNumbers.hasNext()) {
System.out.print(value + ", ");
} else {
System.out.print(value);
}
}
// will print 1, 2, 3, 4, 5
前置文档位于 http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html。你可以看看我个人实践谷歌代码的更完整的实现。
现在,为了获得你需要的效果,我认为你需要在迭代器中插入一个滤波器的概念......由于迭代器依赖于下一个值,因此很难在 hasNext() 上返回 true,然后使用不以 char “a” 开头的值筛选 next() 实现。我认为您需要根据具有给定过滤器的值的过滤列表来尝试使用辅助Interator。
确定。迭代器只是java.util.Iterator
接口的实现。如果你正在使用一个现有的可迭代对象(比如 a ),你需要对它进行子类化并覆盖它的函数,以便返回你自己的函数,或者提供一种在特殊实例中包装标准迭代器的方法(它具有更广泛使用的优点)等。LinkedList
java.util
iterator
Iterator