1

次のシナリオがあります。既存のイテレータがIterator<String> itあり、その頭上で反復します(たとえば、フラグが立てられた要素である最初のk個の要素、つまり「*」で始まる要素)。フラグが立てられた要素が終了したことを知る唯一の方法は、(k + 1)番目の要素がフラグが立てられていないことに気付くことです。

問題は、これを行うと、イテレータitが次のへの呼び出しで最初の値を提供しなくなることですnext()

このイテレータは唯一の引数であり、その署名と実装を変更しないようにしたいので、このイテレータをメソッドに渡したいと思います。私はこれができることを知っています:

   public void methodAcceptingIterator(Iterator<String> it) //current signature

   //change it to 

  public void methodAcceptingIterator(String firstElement, Iterator<String> it)

しかし、これは回避策/ハックがコードの優雅さと一般性を低下させるように見えるので、私はこれをしたくありません。

この問題をどのように解決できるかについてのアイデアはありますか?

4

4 に答える 4

3

GuavaのPeekingIteratorIteratorを使用できます(リンクには、ラッピングを返す静的メソッドのjavadocが含まれていますPeekingIterator)。T peek()これには、次の要素に進むことなく表示するメソッドが含まれます。

于 2012-08-17T19:35:12.520 に答える
1

firstElement解決策は、を格納し、既存のイテレーターを基礎となるイテレーターとして使用して、残りの要素の要求をに委任する独自のイテレーター実装を作成することです。

何かのようなもの:

  public class IteratorMissingFirst<E> implements Iterator<E>{

private Iterator<E> underlyingIterator;
private E firstElement;
private boolean firstElOffered;

public IteratorMissingFirst(E firstElement, Iterator<E> it){
    //initialize all the instance vars
}

public boolean hasNext(){
    if(!firstElOffered && firstElement != null){
            return true;
    }
    else{
        return underlyingIterator.hasNext();
    }
}

public E next(){
    if(!firstElOffered){
        firstElOffered = true;
        return firstElement;
    }
    else return underlyingIterator.next();
}

public void remove(){

}
}
于 2012-08-17T19:30:32.060 に答える
0

methodAcceptingIteratorイテレータから取得した最初の要素を変数に格納してみませんか?または、ピンチで、メソッドの先頭にIteratorあるの内容をコピーするだけです。ArrayListこれで、要素を何度でも再訪できます。

于 2012-08-17T19:32:25.687 に答える
0

IterablesGuavaを使用すると、クラスのいくつかのメソッドを使用して、Razvanのソリューションをより簡単な方法で実装できます。

Iterators.concat(Iterators.singletonIterator(firstElement), it)

これによりIteratorMissingFirst、と同様に機能するイテレータが得られ、前に複数の要素を表示する必要がある場合は簡単に拡張できます(ただし、1つだけではなく2つのオブジェクトが作成されます)。

于 2012-08-17T20:24:17.787 に答える