2012-03-28 81 views

回答

9

那麼你基本上只需要創建一個新的Iterator,它需要一個現有的Iterator並覆蓋它的hasNext和next方法。唯一的困難是一個好的行爲迭代器顯然只需要O(1)空間,所以創建一個新列表並使用它是不好的風格 - 因此我們需要一點點記賬。像下面這樣 - 沒有錯誤處理簡化的僞代碼,假設null作爲無效值等,但對於一個有些通用的解決方案 - 應該給你的基本思路:

Iterator<T> it; 
T next; 

NewIterator(Iterator<T> it) { 
    this.it = it; 
    setNext(); 
} 

void setNext() { 
    while (it.hasNext()) { 
     T val = it.next(); 
     if (validT(val)) { 
      next = val; 
      return; 
     } 
    } 
    next = null; // lets assume null is invalid. 
} 

boolean hasNext() { 
    return next != null; 
} 

T next() { 
    T ret = next; 
    setNext(); 
    return ret; 
} 
+0

我認爲這基本上是正確的。 'setNext'沒有時間限制。因此,setNext,hasNext和next應該同步。 – emory 2012-03-28 02:25:12

+0

我不確定構造函數已經開始掃描底層迭代器是可以接受的... – Kaarel 2013-02-07 11:47:17

+0

@Kaarel那麼你可以很容易地改變它,但唯一的另一個可能的地方是你可以在'hasNext'調用,這更糟糕.. – Voo 2013-02-07 21:08:55

0
Iterator<Integer> itr; 
int cur; 

OddIterator(Iterator<Integer> itr) { 
    this.itr = itr; 
    cur = 0; 
} 

public boolean hasNext() { 
    if ((cur & 1) == 1) { 
     return true; 
    } 
    while (itr != null && itr.hasNext()) { 
     cur = itr.next(); 
     if ((cur & 1) == 1) { 
      return true; 
     } 
    } 
    return false; 
} 

public int next() { 
    if (!hasNext()) { 
     throw new NoSuchElementException(); 
    } 
    int tmp = cur; 
    cur = 0; 
    return tmp; 
} 

我希望這將有助於您。如果我的代碼有任何錯誤。請告訴我。