1

Javaのイテレータについて少し混乱しています。next() が特定の値のみを返すようにするにはどうすればよいですか? たとえば、10 個の要素のブール配列があり、真のものだけを返したいとします。next() メソッドに、その条件をチェックして条件が満たされたときに戻る条件を入れますか? それとも、実際にイテレータを使用して適切な値を取得するまで next() を呼び出し続け、その値を使用するときに条件を確認しますか?

同様に、int の配列があり、各要素がスペースで区切られた配列の文字列表現を作成したいが、負の要素のみを使用したい場合。イテレータでこれを行いたい場合、next() メソッドで負の要素をチェックし、負の次の値のみを返すか、または文字列表現を作成しているときにチェックし、 next( を呼び出し続けますか? ) 負の値を取得するまで、その値を文字列に追加しますか?

ありがとう!

4

4 に答える 4

12

通常の Java イテレーターは、コレクションのすべての要素を繰り返すだけです。そのため、反復ごとに自分で値を確認する必要があります。

あなたが書いたことは、Apache Commons CollectionsFilterIteratorのクラスを使用して実行できます。

JavaDoc から:

このイテレータは、基になるイテレータを装飾し、指定された に一致する要素のみを許可しますPredicate

開始するための例を次に示します。

// Create a predicate class, like this:
class MyAwesomePredicate implements Predicate {

    @Override
    public boolean evaluate(Object object) {

        // If the condition is satisfied, return true.
        // Return false otherwise.

    }     
}

// and pass it to the FilterIterator:
Iterator<SomeClass> matchingObjects = 
    new FilterIterator(myCollection.iterator(), new MyAwesomePredicate());

// Now iterate the maching objects:
while (machingObjects.hasNext() {

    // do your stuff

}

更新:Iterators#filter(Iterator<T>, Predicate<? super T>)必要に応じて、 from Guavaもあります。Apache Commons とは異なり、ジェネリックがサポートされており、(ほぼ間違いなく)クールネス ファクターが高くなっています。

于 2012-06-27T07:49:26.817 に答える
1

イテレータの概念は非常に単純です。要素のコレクションに対するトラバーサル アルゴリズムの実装を隠します (カプセル化します)。next を呼び出します - コレクションの次の要素を取得します。この値をどうするかはあなた次第です。イテレータを使用すると、コレクションの内部実装に依存しなくなります。もちろん、独自のイテレータを作成することもできます (java.util.Iterator インターフェイスを実装する必要があります)。

于 2012-06-27T07:48:52.103 に答える
1

技術的には、どちらも実行可能であるため、実際には設計の問題です。その Iterable 構造を反復するたびにその条件が必要になることが確実な場合は、Iterator のサブクラスの next() メソッドで条件を使用するよりも、それ以外の場合は、Iterator の外でアプリをチェックインすることをお勧めします。

また、next() メソッドでテストを行うと、アプリケーション コードで反復する要素の数が減るため、パフォーマンスが向上する可能性があります。したがって、パフォーマンスが問題になる場合は、おそらくそれが良い考えです。

于 2012-06-27T07:50:00.167 に答える
1

Iteratorコレクションを反復処理するために使用され、すべての要素を 1 つずつ返します。を使用する他の方法はないIteratorので、反復でチェックを行うか、独自の特別な反復子を作成します。

于 2012-06-27T07:47:22.827 に答える