2012-12-19 79 views
-6

我有以下代碼:的ListIterator奇怪添加到ArrayList的

ArrayList<String> words; 
    words = new ArrayList<String>(); 
    words.add("is"); 
    words.add("us"); 
    ListIterator<String> it; 
    it = words.listIterator(); 
    it.add("##"); 
    System.out.println(words); 
    it.next(); 
    it.next(); 
    it.previous(); 
    it.set("##"); 
    System.out.println(words); 

我期望的輸出會## us ##,但是當我運行該程序返回## is ##。我期望這與ListIterator增加一個項目到ArrayList而不是ArrayList增加一個項目到它自己。

爲什麼程序會以這種方式運行?

+11

你的程序比需要的要複雜得多,既有'add'又有'set',還有前後移動。目前還不清楚*爲什麼*你會期待「## us ##」的結果。 –

回答

8

你的問題不太清楚,但我懷疑你可能會丟失的主要觀點是,ListIterator.add插入在當前位置:

的元素將被返回的下一個元素之前立即插入next()(如果有的話)以及next()返回的下一個元素之後(如果有的話)。

而且也:

新的元素被隱式遊標之前插入:後續調用next不會受到影響

所以你要it.add("##")初始呼叫後,列表中包含"##""is""us"。然後再移動兩次 - 第一次移動光標至"is"(返回)。第二個將光標移動到"us"之後(返回)。然後previous()回報"us"電話再次,終於set()調用替換"us""##"

替換next()返回或指定的元素(可選操作)的最後一個元素前面的()。

這一切看起來都像是完全遵從文檔。不幸的是,目前還不清楚哪些步驟會讓你感到困惑,因爲你在一個問題中混合了很多。

+0

感謝您的回覆,我對我的問題缺乏特異性表示歉意。這段代碼是我的CS類的一個樣本,它(如你所提到的)強烈強迫過度複雜的代碼。我包括了整個片段,以確保我沒有意外排除可能使其返回結果的線。再次感謝。 –