gpt4 book ai didi

java - 我们可以用 Java 编写自己的迭代器吗?

转载 作者:IT老高 更新时间:2023-10-28 11:36:20 24 4
gpt4 key购买 nike

如果我有一个包含 [alice, bob, abigail, charlie] 的列表,并且我想编写一个迭代器,以便它遍历以 'a' 开头的元素,我可以编写自己的吗?我怎样才能做到这一点 ?

最佳答案

最好的可重用选项是实现接口(interface)Iterable并覆盖方法iterator()。

这是一个类 ArrayList 类实现接口(interface)的示例,您可以在其中重写方法 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;
}
}

该类使用 Generics 实现 Iterable 接口(interface).考虑到数组中有元素,您将能够获得一个迭代器的实例,例如,它是“foreach”循环使用的所需实例。

您可以只创建迭代器的匿名实例而不创建扩展迭代器,并利用 currentSize 的值来验证您可以在数组中导航的位置(假设您创建了一个容量为 10 的数组,但您在 0 和 1 处只有 2 个元素)。该实例将拥有其所在位置的所有者计数器,您需要做的就是使用 hasNext() 来验证当前值是否不为空,以及 next() 将返回您的 currentIndex 的实例。以下是使用此 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

如果需要,您也可以使用 Iterator 实例对其进行迭代:

// 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

foreach 文档位于 http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html .更完整的实现可以看我的个人实践google code .

现在,为了得到你需要的效果,我认为你需要在迭代器中插入一个过滤器的概念......由于迭代器依赖于下一个值,因此很难在 hasNext() 上返回 true ,然后使用例如不以字符“a”开头的值过滤 next() 实现。我认为您需要根据带有给定过滤器值的过滤列表来使用辅助交互器。

关于java - 我们可以用 Java 编写自己的迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com