作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何自定义一个迭代器可以遍历list中哪个元素也是list,例如{{1,2,3},{4,5,6}},这个自定义迭代器可以输出{1,2,3, 4,5,6}
class CustomIterator<E> implements Iterator<E>{
public CustomIterator(Iterator<Iterator<E>> root){
//add implement code...
}
//add implement code...
}
最佳答案
这个问题我花了很多时间,终于弄清楚了,下面是完整的实现和测试代码,感谢@AlexHall的大力帮助。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
class IteratorFlattener<E> implements Iterator<E> {
private Iterator<Iterator<E>> root;
private Iterator<E> sub;
public IteratorFlattener(Iterator<Iterator<E>> root) {
this.root = root;
if(root.hasNext()){
this.sub = root.next();
}
}
@Override
public boolean hasNext(){
if(sub != null){
if(sub.hasNext()){
return true;
}
if(root.hasNext()){
sub = root.next();
return sub.hasNext();
}
}
return false;
}
@Override
public E next(){
if(sub == null){
throw new NoSuchElementException("root iterator was empty");
}
return sub.next();
}
@Override
public void remove(){
if(sub == null){
throw new NoSuchElementException("root iterator was empty");
}
sub.remove();
}
public static void main(String[] args){
System.out.println("start to test traverse");
List<Integer> l1 = new ArrayList<>();
l1.add(1);
List<Integer> l2 = new ArrayList<>();
l2.add(2);
l2.add(3);
List<Integer> l3 = new ArrayList<>();
l3.add(4);
l3.add(5);
l3.add(6);
List<Iterator<Integer>> root = new ArrayList<>();
root.add(l1.iterator());
root.add(l2.iterator());
root.add(l3.iterator());
IteratorFlattener it = new IteratorFlattener<>(root.iterator());
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("start to test remove method");
l1 = new ArrayList<>();
l1.add(1);
l2 = new ArrayList<>();
l2.add(2);
l2.add(3);
l3 = new ArrayList<>();
l3.add(4);
l3.add(5);
l3.add(6);
root = new ArrayList<>();
root.add(l1.iterator());
root.add(l2.iterator());
root.add(l3.iterator());
int i = 0;
it = new IteratorFlattener<>(root.iterator());
while(it.hasNext() && i < 3){
it.next();
it.remove();
i++;
}
while(it.hasNext()){
System.out.println(it.next());
}
}
}
关于java - 自定义迭代器,可以遍历迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795132/
我是一名优秀的程序员,十分优秀!