2014-02-18 106 views
0
Iterator<String> ir = arr.iterator(); 

while(ir.hasNext()) { 
    String an = ir.next(); 
    System.out.println(an); 
} 

ArrayList ir返回指向第一個列表對象。 現在ir.next()必須指向下一個對象。 那麼爲什麼它在循環中第一次運行時指向第一個對象呢?瞭解iterator.next功能

此外,

ListIterator<String> ir= arr.listIterator(); 

while(ir.hasNext()) 
{ 
    String an= ir.next(); 

    ir.set(an + '+'); 

    System.out.println(an); 
} 

爲什麼它不追加'+'?它只是打印原來的ArrayList

+1

因爲它在第一個對象前開始*你必須調用'next'來獲得第一個對象。 –

+1

它首先返回值/對象並指向下一項。它像x ++而不是++ x – Jayy

+1

閱讀javadoc是一個很好的開始......它可能會讓你花1/4的時間提問。 – Augusto

回答

6

hasNext()只會告訴你如果集合中還有另一個元素可以迭代。 next()實際返回所述元素。光標的初始位置是之前的的第一個元素。

例如,假設你有以下幾點:

0 1 2 3 4 
| 8 | 5 | 2 | 3 | 7 | 

光標實際上是指向一個位置之前的第一個元素:

0 1 2 3 4 
    | 8 | 5 | 2 | 3 | 7 | 

^ 
| 
cursor 

當你做hasNext(),它檢查看看是否有地址cursor + 1。如果您有一個空列表,則cursor + 1(即索引0處沒有任何內容),因此它將返回false。如果你在最後一個元素,cursor + 1 == list.size()這意味着在列表結束後沒有任何東西。如果您位於列表中的其他位置,則cursor + 1是填充的有效索引,因此它將返回true

當您實際上next()時,它將前進光標並將元素返回到新的位置。現在,光標位於下一個元素之前的新位置。

現在它甚至都不在乎它是如何在內部完成的。光標可能會在第一次指向第一個元素時指向。如果是這樣,所有你需要的是處理這種情況的特殊邏輯(可能是一個檢查是否曾經被調用過的標誌)。

所有你需要在Iterator的情況瞭解的是,hasNext()會告訴你,如果有剩餘,你可以遍歷,並next()將返回該元素的元素。這種行爲在調用中是一致的,並且在所有實現中應該是一致的。

+0

但相應的代碼 String an = ir.next(); ir.set(an +'+'); System.out.println(an); 必須用'+'打印數組列表,但不是。 – hitesh

+0

什麼是'ir.set()'? –

+0

對不起,我忘了提及.Listiterator ir = new listiterator ();這裏的ir是列表迭代器。它可以修改當前的收集元素。 – hitesh

0

Iterator在第一次調用之前指向第一個項目並不是問題。

next會發生什麼情況如下:

  1. 商店稍後返回當前值。
  2. 將索引提前到超出當前值的下一個值(或者如果不在列表的末尾,則爲「無」)。
  3. 返回步驟1

這真的是指向「下一個」值在任何時候,即使迭代完成,並沒有更多的項目,在這種情況下,沒有電流值「下一個」項目。

這裏的example source code from ArrayList's iterator,一個內部類稱爲Itr

private class Itr implements Iterator<E> 
    int cursor;  // index of next element to return 

默認值是0,已經指向第一個元素。

next()方法執行上述步驟(加上一些其他步驟以防止在迭代期間修改)。

@SuppressWarnings("unchecked") 
public E next() { 
    checkForComodification(); 
    int i = cursor; 
    if (i >= size) 
     throw new NoSuchElementException(); 
    Object[] elementData = ArrayList.this.elementData; 
    if (i >= elementData.length) 
     throw new ConcurrentModificationException(); 
    cursor = i + 1; 
    return (E) elementData[lastRet = i]; 
}