可以遍历迭代器的自定义迭代器

时间:2015-09-26 08:26:26

标签: java iterator

如何定制迭代器可以遍历列表哪个元素也是一个列表,例如{{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...

}

2 个答案:

答案 0 :(得分:1)

我在这个问题上花了很多时间,最后我弄明白了,下面是完整的实现和测试代码,谢谢@ 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());
        }
    }
}

答案 1 :(得分:0)

这不是一个答案,而是一个不符合令人遗憾的有限评论格式的扩展评论。

这是一个构建Iterator<Iterator<Integer>>的小程序。您可以使用此类操作为CustomIterator构建测试用例。您的类将获得的所有内容都是testIterator引用,从中它应该能够遍历原始Integer数组的内容。

(我把&#34; public&#34;关闭了CustomIterator,所以我可以用我的main方法将它放在一个文件中。你不会这样做。)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {
  public static void main(String[] main) {
    Iterator<Integer> i1 = Arrays.asList(new Integer[]{1}).iterator();
    Iterator<Integer> i2 = Arrays.asList(new Integer[]{2,3}).iterator();
    Iterator<Integer> i3 = Arrays.asList(new Integer[]{4,5,6}).iterator();
    List<Iterator<Integer>> allIterators = new ArrayList<>();
    allIterators.add(i1);
    allIterators.add(i2);
    allIterators.add(i3);

    Iterator<Iterator<Integer>> testIterator = allIterators.iterator();
    Iterator<Integer> myIterator = new CustomIterator<>(testIterator);

    while(myIterator.hasNext()){
      System.out.println(myIterator.next());
    }

  }
}

class CustomIterator<E> implements Iterator<E>{

public CustomIterator(Iterator<Iterator<E>> root){
    //add implement code...
}

//add implement code...

}