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.
public class Vector2D implements Iterator<Integer> {
Iterator<Integer> Rowiter;
Iterator<List<Integer>> Coliter;
Integer next;
public Vector2D(List<List<Integer>> vec2d) {
Coliter = vec2d.iterator();
if (Coliter.hasNext()) {
Rowiter = Coliter.next().iterator();
while (!Rowiter.hasNext() && Coliter.hasNext()) {
Rowiter = Coliter.next().iterator();
}
next = Rowiter.hasNext()? Rowiter.next(): null;
}
}
@Override
public Integer next() {
Integer res = next;
if (Rowiter.hasNext()) {
next = Rowiter.next();
} else {
while (!Rowiter.hasNext() && Coliter.hasNext()) {
Rowiter = Coliter.next().iterator();
}
next = Rowiter.hasNext()? Rowiter.next(): null;
}
return res;
}
@Override
public boolean hasNext() {
return next != null;
}
}
/**
* Your Vector2D object will be instantiated and called as such:
* Vector2D i = new Vector2D(vec2d);
* while (i.hasNext()) v[f()] = i.next();
*/
但是可以简化代码,因为next和hasnext函数Iterator都有,可以直接用。代码如下:
public class Vector2D implements Iterator<Integer> {
private Iterator<List<Integer>> rec;
private Iterator<Integer> n;
public Vector2D(List<List<Integer>> vec2d) {
rec = vec2d.iterator();
}
@Override
public Integer next() {
return n.next();
}
@Override
public boolean hasNext() {
while((n==null||!n.hasNext())&&rec.hasNext())
n = rec.next().iterator();
return n!=null&&n.hasNext();
}
}
/**
* Your Vector2D object will be instantiated and called as such:
* Vector2D i = new Vector2D(vec2d);
* while (i.hasNext()) v[f()] = i.next();
*/