隨筆-50  評(píng)論-55  文章-8  trackbacks-0

          ??????? 以前一直都用 Iterator,一直沒出現(xiàn)問題,后來當(dāng)我將 Iterator 作為一個(gè)方法的參數(shù)傳進(jìn)去,當(dāng)Iterator 執(zhí)行循環(huán)兩次的時(shí)候問題出現(xiàn)了,第一次可以執(zhí)行,而第二次卻輸出不了值了;經(jīng)過同事提醒,原來 Iterator? 執(zhí)行循環(huán)的時(shí)候,一次執(zhí)行就到達(dá)最后的節(jié)點(diǎn),若再循環(huán)一次,自然不能再從頭開始。那么有什么辦法執(zhí)行兩次或兩次以上呢,解決的辦法就是再重新生成一個(gè)新的Iterator對(duì)象。 我做了一個(gè)試驗(yàn),如下:
          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();
          ?? }
          }
          輸出的結(jié)果:
          (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
          可以看出,它根本不執(zhí)行第(2)個(gè)循環(huán),當(dāng)重新生成一個(gè)新的Iterator對(duì)象,第(3)個(gè)方法就能輸出循環(huán)了。

          posted on 2007-09-20 11:52 蔣家狂潮 閱讀(2808) 評(píng)論(12)  編輯  收藏 所屬分類: Basic

          評(píng)論:
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗啊! 2007-09-20 11:56 | TigerShark
          請(qǐng)參見Iterator模式,
          每次使用都需要?jiǎng)?chuàng)建一個(gè)新的Iterator。  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗?。? 2007-09-20 12:05 | 千里冰封
          你可以用ListIterator,它可以雙向遍歷
          一般來說,Iterator都是用于遍歷的,一般一遍就可以了,如果一直都可以的話,那么它的作用也就失去了.  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2007-09-20 13:20 | 死循環(huán)
          受教了.....  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2007-09-20 13:31 | 黑盒子
          以前知道,但是從來沒有接觸過。謝謝你的例子。  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗啊![未登錄] 2007-09-20 16:25 | jason
          不明白你到底要干什么,你見過一個(gè)Iterator對(duì)象循環(huán)兩次的嗎?
          就拿你的例子來說,你只不過是把Iterator重新賦值,跟本就不是循環(huán)兩次,你自己都說了它是一個(gè)新的對(duì)象了,怎么還循環(huán)兩次呢????
          自己好好看看API,別把別人給誘導(dǎo)了  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??![未登錄] 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);
          }
          自己好好看看  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2007-09-20 17:05 | 蔣家狂潮
          樓上的太激動(dòng)了,我只不過把看到現(xiàn)象帖出來討論討論。  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗啊! 2007-09-20 19:14 | Unmi
          Iterator就像ResultSet一樣,內(nèi)部有一個(gè)指針,指向上一個(gè)元素,第一次迭代完成,指針在最后一個(gè)元素
          再次迭代,向后當(dāng)然走訪問不到數(shù)據(jù)了,除非把指針再移動(dòng)第一個(gè)元素前同,像可回溯的記錄集那樣

          最好的,能讓你留下深刻印象的辦法就是去讀JDK的源代碼,step into.  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2007-09-21 10:06 | 辛科
          樓上正解?。。?!  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??![未登錄] 2007-09-21 17:22 | hehe
          Iterator遍歷完了是沒有重置的。

          建議你要用,封裝一個(gè)方法出來,每次調(diào)用就可以了  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2007-12-06 16:39 | 浴雨
          這個(gè)問題我也遇到過。
          “不明白你到底要干什么,你見過一個(gè)Iterator對(duì)象循環(huán)兩次的嗎? ”
          樓上的真是少見多怪,在很多場合,在遇到要反復(fù)使用同一個(gè)對(duì)象時(shí),
          比如把用戶對(duì)象放到session中,反復(fù)使用。Iterator也一樣,有時(shí)后把數(shù)據(jù)
          查詢出來后,在以后也許還用到。  回復(fù)  更多評(píng)論
            
          # re: 原來Iterator是這樣的,才發(fā)現(xiàn),失敗??! 2014-11-19 16:51 | stupidJason
          代碼寫成這樣還來說樓主
          list New了5次,你想說明啥?
          看到樓主帖子還挺高興的,看到你這評(píng)論直接笑噴了@jason
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 安新县| 柞水县| 桂阳县| 和龙市| 汽车| 丰城市| 宝丰县| 南康市| 巴彦县| 昌图县| 孟连| 玉屏| 开平市| 沂水县| 娄烦县| 互助| 松溪县| 阿克苏市| 海丰县| 湘西| 惠安县| 资阳市| 桃园县| 卓资县| 石城县| 赤水市| 仁布县| 门头沟区| 恩施市| 凌云县| 渭南市| 宜良县| 华蓥市| 梧州市| 理塘县| 乐安县| 砀山县| 苍南县| 岑巩县| 当阳市| 浑源县|