调用anIterable.iterator()
是否会返回新的或现有的迭代器?它是否依赖于Iterable实现?
更具体地说,以下代码是否会按预期工作(即内部循环将从头开始迭代)?
for (Item itemA : items) {
for (Item itemB : items) {
....
}
}
如果没有,那么如何在Iterable
上实现这一目标?
答案 0 :(得分:2)
<强>可迭代强>
Iterable
是Interface
,我们需要为iterator()方法提供实施。
public class MyCollection<E> implements Iterable<E>{
public Iterator<E> iterator() {
return new MyIterator<E>();
}
}
MyIterator
类的实现框架:
public class MyIterator <T> implements Iterator<T> {
public boolean hasNext() {
//implement...
}
public T next() {
//implement...;
}
public void remove() {
//implement... if supported.
}
}
使用MyCollection
生成,并使用新的for-loop
public static void main(String[] args) {
MyCollection<String> stringCollection = new MyCollection<String>();
for(String string : stringCollection){
}
}
对于你的第二个问题,输出说话,内循环将从每次开始循环。
public static void main(String[] args) {
List<String> names = new ArrayList<String>();
names.add("a1");
names.add("a2");
for (String itemA : names) {
for (String itemB : names) {
System.out.println("Inner => " + itemB);
}
System.out.println("Outer => " + itemA);
}
}
Inner => a1
Inner => a2
Outer => a1
Inner => a1
Inner => a2
Outer => a2
参考this作为示例
答案 1 :(得分:2)
Iterable<T>
是一个接口,因此没有默认实现。
例如,在ArrayList<T>
中,iterator<E>
方法将在每次调用时返回嵌套类Itr
的新实例:
public Iterator<E> iterator() {
return new Itr();
}
答案 2 :(得分:1)
anIterable.iterator()
应该返回一个新的迭代器,在这种情况下,嵌套的增强型for循环将按预期工作。在Iterable
被调用时,iterator()
的所有标准实现都会返回一个新的迭代器。
如果Iterable接口的某些错误实现在连续调用iterator()
时没有返回新的Iterator,则嵌套的增强型for循环将会中断。
BTW,Iterable
的{{1}}方法的Javadoc不要求它返回一个新的迭代器。
答案 3 :(得分:0)
您可以并行迭代同一个集合,但不能修改它。所以你的代码是完全正确的:每次都会返回新的DateTime dt = DateTime.Now; // get current date time
txtFormat.Text = string.Format("{0:yyyy/dd/MMM hh:mm:ss}", dt); // you can specify format according to your need
。
答案 4 :(得分:0)
取决于如何实现可迭代接口。通常,集合frameworl类返回新实例。