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();
*/