use*_*345 6 java foreach iterator iterable arraylist
我相信我已经注意到,对于某些Iterables(例如这个IterableString类),要么创建一个新的迭代器,要么迭代器以某种方式重置为每个新的foreach构造的开头,但这似乎与其他Iterables没有发生...
例如,如果您运行以下代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您将看到以下输出:
***
O
N
C
E
***
***
T
W
I
C
E
***
T
W
I
C
E
Run Code Online (Sandbox Code Playgroud)
带有x的第二个foreach循环似乎从它停止的位置开始(在最后一个项目之后),但是带y的第二个foreach循环似乎从它第一次开始的位置开始(在第一个项目处).为什么这样,我们如何使Iterables行为像后者(ArrayLists)?
更具体地说,我们如何修改像IterableString这样的类才能像ArrayList一样工作?
该类IterableString(由您的链接文章定义)是Iterable和Iterator。一个好主意是否值得商de-但一个简单的解决方法是:
// This method implements Iterable.
public Iterator<Character> iterator() {
return new IterableString(this.str);
}
Run Code Online (Sandbox Code Playgroud)