“Java可编程文件”;“重置”;具有每个Foreach构造的迭代器
我相信我已经注意到,对于某些Iterables(比如这个),要么创建了一个新的迭代器,要么迭代器以某种方式重置为每个新的foreach构造的开始,但这似乎不会发生在其他Iterables中 例如,如果运行以下代码:“Java可编程文件”;“重置”;具有每个Foreach构造的迭代器,java,arraylist,foreach,iterator,iterable,Java,Arraylist,Foreach,Iterator,Iterable,我相信我已经注意到,对于某些Iterables(比如这个),要么创建了一个新的迭代器,要么迭代器以某种方式重置为每个新的foreach构造的开始,但这似乎不会发生在其他Iterables中 例如,如果运行以下代码: import java.util.ArrayList; public class test { public static void main(String args[]) { IterableString x = new IterableString("ONC
import java.util.ArrayList;
public class test {
public static void main(String args[]) {
IterableString x = new IterableString("ONCE");
System.out.println("***");
for (char ch : x){
System.out.println(ch);
}
System.out.println("***");
for (char ch : x){
System.out.println(ch);
}
ArrayList y = new ArrayList();
y.add('T');
y.add('W');
y.add('I');
y.add('C');
y.add('E');
System.out.println("***");
for (char ch : y){
System.out.println(ch);
}
System.out.println("***");
for (char ch : y){
System.out.println(ch);
}
System.out.println();
}
}
您将看到以下输出:
***
O
N
C
E
***
***
T
W
I
C
E
***
T
W
I
C
E
带有x的第二个foreach循环似乎从它停止的地方开始(在最后一项之后),但是带有y的第二个foreach循环似乎从它第一次开始的地方开始(在第一项)。这是为什么?我们如何才能使Iterables表现得像后者(ArrayList)
更具体地说,我们如何修改像IterableString这样的类以使其像ArrayList一样工作?一个
ArrayList
能够在java foreach循环中迭代,因为它在java中实现了Iterable
接口。Iterable
接口概述了一个方法iterator
,该方法返回集合的迭代器。在java中使用foreach循环会在后台使用此方法中的迭代器。每次创建新的foreach循环时,ArrayList
都会提供一个新的迭代器
如果您想在Java中创建一个可以使用foreach循环进行迭代的类,则需要实现
Iterable
接口并定义如何迭代集合。类IterableString
(由您定义)既是Iterable
又是迭代器。这是否是一个好主意仍有争议,但一个简单的解决办法是:
// This method implements Iterable.
public Iterator<Character> iterator() {
return new IterableString(this.str);
}
//此方法实现Iterable。
公共迭代器迭代器(){
返回新的IterableString(this.str);
}
到底是什么??这个未知对象可能与迭代器的配置方式有关,Iterable
的Javadoc似乎没有太多说明,以强制每个调用iterator()
都返回一个新的iterator
——但这似乎是JDK接受的做法(而且是合理的)。因此,它看起来像是一个由谁创建的IterableString
的“bug”。这仍然不能解决OPs问题。你的评论@code Guru让我有点困惑。也许我误解了这个问题,但我概述了为什么ArrayList在foreach循环中具有这种行为,以及如何在用户定义的类中模拟这种行为。问题是为什么IterableString
类的行为与ArrayList
不同。谢谢!我被我在其他iterables中看到的类似问题甩了(比如嵌套迭代器类有另一个问题,需要考虑它在其外部类中更改组件时的状态意识)。出于某种原因,错误的一致性给我的印象是,与我所看到的非标准iterables中的碎片相比,ArrayList等iterables有一些特殊之处。