251. Flatten 2D Vector

1. 用普通方法做,不用iterator.

要设置两个变量,一个指向目前遍历到的list的位置,一个指向目前的list里面元素的位置。

hasNext()中把eleIndex和listIndex都指向下一个可以用的值的位置,如果超过了边缘都没有可以用的,就返回false

next()就把两个变量位置的值返回就可以了

 1 public class Vector2D implements Iterator<Integer> {
 2     int eleIndex, listIndex;
 3     List<List<Integer>> vec;
 4     
 5     public Vector2D(List<List<Integer>> vec2d) {
 6         vec = vec2d;
 7         eleIndex = 0;
 8         listIndex = 0;
 9     }
10 
11     @Override
12     public Integer next() {
13         return vec.get(listIndex).get(eleIndex++);
14     }
15 
16     @Override
17     public boolean hasNext() {
18         while(listIndex < vec.size()) {
19             if(eleIndex < vec.get(listIndex).size()) {
20                 return true;
21             } else {
22                 eleIndex = 0;
23                 listIndex++;
24             }
25         }
26         return false;
27     }
28 }

需要注意的是:

13行,在next()之后才把eleIndex的值++,不能在hasNext()里面加,因为理论上不是每次调用hashNext()都必须跟着next()的

 

2. 用iterator的方法

道理上是和上面的方法一样的,就是把具体的index换成iterator

 1 public class Vector2D implements Iterator<Integer> {
 2     Iterator<List<Integer>> listIt;
 3     Iterator<Integer> eleIt;
 4 
 5     public Vector2D(List<List<Integer>> vec2d) {
 6         listIt = vec2d.iterator();
 7     }
 8 
 9     @Override
10     public Integer next() {
11         return eleIt.next();
12     }
13 
14     @Override
15     public boolean hasNext() {
16         while((eleIt == null || !eleIt.hasNext()) && listIt.hasNext()) {
17             eleIt = listIt.next().iterator();
18         }
19         return eleIt != null && eleIt.hasNext();
20     }
21 }

需要注意的是

16行while不是if,因为一直要找到下个可以用的,还有就是第一组对eleIt的判断要加括号,不然会先执行&&,如果是第一个eleIt,那么eleIt会直接被赋listIt.next()的值,但是这个有可能从头就是一个空的list,这时候机会出错

 

posted @ 2016-08-11 02:25  warmland  阅读(190)  评论(0编辑  收藏  举报