2012-03-28 5 views
3

私はこのインタビューでJavaのインタビューを受けました。私は整数のリストのためのイテレータを与えられています。私は、このイテレータを引数として返す関数を書く必要があり、偶数だけのイテレータを返します。私は言われた、私は数字の元のリストを変更することはできません。したがって、リストから奇数を削除することは解決策ではありません。お知らせ下さい。ありがとう。整数のリストのイテレータを指定すると、偶数のイテレータを返す方法はありますか?

答えて

9

基本的には、既存のIteratorを使用し、hasNextメソッドと次のメソッドを上書きする新しいIteratorを作成するだけです。唯一の難点は、良好な振る舞いをするイテレータが明らかに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

+0

コンストラクタが既に基本的なイテレータをスキャンし始めていることが受け入れられるかどうかはわかりません... – Kaarel

+0

@Kaarelそれを簡単に変更できますが、それ以外の可能性のある場所は 'hasNext'呼び出しですこれはもっと悪いです – Voo

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; 
} 

を私はこれが役立つだろう願っています君は。私のコードにバグがある場合。私にお知らせください。

関連する問題