随笔-50  评论-55  文章-8  trackbacks-0

        以前一直都用 Iterator,一直没出现问题,后来当我将 Iterator 作为一个方法的参数传进去,当Iterator 执行循环两次的时候问题出现了,第一次可以执行,而第二次却输出不了值了;经过同事提醒,原来 Iterator  执行循环的时候,一次执行就到达最后的节点,若再循环一次,自然不能再从头开始。那么有什么办法执行两次或两次以上呢,解决的办法就是再重新生成一个新的Iterator对象。 我做了一个试验,如下:
import java.util.ArrayList;
import java.util.Iterator;
public class TestIterator {
   public  TestIterator(){
    ArrayList list=new ArrayList();
    Integer in;
    for(int i=0;i<5;i++){
     in=new Integer(i+10);
     list.add(in);
    }
    Iterator it=list.iterator();
    System.out.println("(1) first time to loop.....");
    System.out.println("the (1) result is.....");
    while(it.hasNext()){
     Integer i=(Integer)it.next();
     System.out.println("(1)The value is:"+i);
    }
    System.out.println();
    System.out.println("(2) second time to loop.....");
    System.out.println("the (2) result is.....");
    while(it.hasNext()){
     Integer i=(Integer)it.next();
     System.out.println("(2)The value is:"+i);
    }
    System.out.println();
    System.out.println("(3) third time to loop.....");
    System.out.println("when this iterator is new one...");
    System.out.println("the (3) result is.....");
    it=list.iterator();
    while(it.hasNext()){
     Integer i=(Integer)it.next();
     System.out.println("(3)The value is:"+i);
    }
   }
   public static void main(String args[]){
      new  TestIterator();
   }
}
输出的结果:
(1) first time to loop.....
the (1) result is.....
(1)The value is:10
(1)The value is:11
(1)The value is:12
(1)The value is:13
(1)The value is:14

(2) second time to loop.....
the (2) result is.....

(3) third time to loop.....
when this iterator is new one...
the (3) result is.....
(3)The value is:10
(3)The value is:11
(3)The value is:12
(3)The value is:13
(3)The value is:14
可以看出,它根本不执行第(2)个循环,当重新生成一个新的Iterator对象,第(3)个方法就能输出循环了。

posted on 2007-09-20 11:52 蒋家狂潮 阅读(2787) 评论(12)  编辑  收藏 所属分类: Basic

评论:
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 11:56 | TigerShark
请参见Iterator模式,
每次使用都需要创建一个新的Iterator。  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 12:05 | 千里冰封
你可以用ListIterator,它可以双向遍历
一般来说,Iterator都是用于遍历的,一般一遍就可以了,如果一直都可以的话,那么它的作用也就失去了.  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 13:20 | 死循环
受教了.....  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 13:31 | 黑盒子
以前知道,但是从来没有接触过。谢谢你的例子。  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊![未登录] 2007-09-20 16:25 | jason
不明白你到底要干什么,你见过一个Iterator对象循环两次的吗?
就拿你的例子来说,你只不过是把Iterator重新赋值,跟本就不是循环两次,你自己都说了它是一个新的对象了,怎么还循环两次呢????
自己好好看看API,别把别人给诱导了  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊![未登录] 2007-09-20 16:28 | jason
public static void main(String[] args) {
List list = null;
for(int i=1;i<6;i++){
list = new ArrayList();
list.add(i);
}
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
boolean result = it.hasNext();
System.out.println(result);
}
自己好好看看  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 17:05 | 蒋家狂潮
楼上的太激动了,我只不过把看到现象帖出来讨论讨论。  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-20 19:14 | Unmi
Iterator就像ResultSet一样,内部有一个指针,指向上一个元素,第一次迭代完成,指针在最后一个元素
再次迭代,向后当然走访问不到数据了,除非把指针再移动第一个元素前同,像可回溯的记录集那样

最好的,能让你留下深刻印象的办法就是去读JDK的源代码,step into.  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-09-21 10:06 | 辛科
楼上正解!!!!  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊![未登录] 2007-09-21 17:22 | hehe
Iterator遍历完了是没有重置的。

建议你要用,封装一个方法出来,每次调用就可以了  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2007-12-06 16:39 | 浴雨
這個問題我也遇到過。
“不明白你到底要干什么,你见过一个Iterator对象循环两次的吗? ”
楼上的真是少见多怪,在很多场合,在遇到要反复使用同一个对象时,
比如把用户对象放到session中,反复使用。Iterator也一样,有时后把数据
查询出来后,在以后也许还用到。  回复  更多评论
  
# re: 原来Iterator是这样的,才发现,失败啊! 2014-11-19 16:51 | stupidJason
代码写成这样还来说楼主
list New了5次,你想说明啥?
看到楼主帖子还挺高兴的,看到你这评论直接笑喷了@jason
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: