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,这时候机会出错