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]​​.

分析:https://segmentfault.com/a/1190000003791233

用一个数组表示每个List的迭代器,然后再记录一个变量,用来表示当前用到了第几个迭代器。



1 public class Vector2D {
2
3 List<Iterator<Integer>> its;
4 int curr = 0;
5
6 public Vector2D(List<List<Integer>> vec2d) {
7 this.its = new ArrayList<Iterator<Integer>>();
8 for (List<Integer> l : vec2d) {
9 // 只将非空的迭代器加入数组
10 if (l.size() > 0) {
11 this.its.add(l.iterator());
12 }
13 }
14 }
15
16 public int next() {
17 Integer res = its.get(curr).next();
18 // 如果该迭代器用完了,换到下一个
19 if (!its.get(curr).hasNext()) {
20 curr++;
21 }
22 return res;
23 }
24
25 public boolean hasNext() {
26 return curr < its.size() && its.get(curr).hasNext();
27 }
28 }