251. Flatten 2D Vector

Implement an iterator to flatten a 2d vector.
For example,Given 2d vector =

[
 [1,2], [3], [4,5,6]
]

By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,2,3,4,5,6].
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.

一刷
方法1: iterator

public class Vector2D implements Iterator<Integer> {
    
    private List<List<Integer>> vec2d;
    private Iterator<List<Integer>> outer;
    private Iterator<Integer> inner;
    
    
    public Vector2D(List<List<Integer>> vec2d) {
        //deep copy
        this.vec2d = new ArrayList<>();
        for(List<Integer> list : vec2d){
            this.vec2d.add(new ArrayList<>(list));
        }
        this.outer = this.vec2d.iterator();
    }

    @Override
    public Integer next() {
         //hasNext();
        return inner.next();
    }

    @Override
    public boolean hasNext() {
        if(inner==null || !inner.hasNext() && outer.hasNext()){
            inner = outer.next().iterator();
        }
        return inner!=null && inner.hasNext();
    }
}

/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */

方法2:index

public class Vector2D implements Iterator<Integer> {
    
    int indexList, indexEle;
    List<List<Integer>> vec; 
    
    public Vector2D(List<List<Integer>> vec2d) {
        indexList = 0;
        indexEle = 0;
        vec = vec2d;
    }

    @Override
    public Integer next() {
        return vec.get(indexList).get(indexEle++);
    }

    @Override
    public boolean hasNext() {
        while(indexList < vec.size()){
            if(indexEle < vec.get(indexList).size())
                return true;
            else{
                indexList++;
                indexEle = 0;
            }
        }
        return false;
    }
}

/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容