12

個人的には、java.util.Iterator によって提供される機能の範囲はかなり哀れだと思います。少なくとも、次のようなメソッドが必要です。

  • peek() はイテレータを進めずに次の要素を返します
  • previous() は前の要素を返します

first() や last() など、他にも多くの可能性があります。

そのようなサードパーティのイテレータが存在するかどうかは誰にもわかりませんか? 既存の Java コレクションと連携できるように、おそらく java.util.Iterator のデコレーターとして実装する必要があります。理想的には、「ジェネリック対応」である必要があります。

前もってありがとう、ドン

4

11 に答える 11

11

previous()を使うだけで簡単に取得できjava.util.ListIteratorます。

その時点でのピークは、次のようにして簡単に実装できます。

public <T> T peek(ListIterator<T> iter) throws NoSuchElementException {
    T obj = iter.next();
    iter.previous();
    return obj;
}

残念ながら、各コレクション クラスは独自の反復子を実装するため、ユーティリティ メソッドとして使用する方が簡単です。ラッパーを実行して、一部のインターフェイスの各コレクションでピーク メソッドを取得するには、MyListIteratorかなりの作業が必要です。

于 2008-10-10T17:53:43.357 に答える
8

ApacheCommonsコレクション

Googleコレクション

于 2008-10-10T18:35:20.307 に答える
8

これらが実装されていない理由は、一部のコレクションでは自明ではなく、パフォーマンスに大きな影響を与えるためだと思います。気になるコレクションでこれを機能させるのは非常に簡単だと思います。

また、Java イテレーターが現在の値を移動せずに取得する方法がないことも気に入りません (したがって、イテレーターを渡すだけで、値に基づいて分岐するコードを簡単に作成することはできません。値を渡す必要があります。今も持っています)。

于 2008-10-10T17:56:50.103 に答える
4

一般的な演算子がこれらの機能を実装しないのには、かなりの理由があります。これらの機能は、すべてのコンテナーに存在するわけではありません。典型的な例は、ストリームとして表示されるファイルなど、外部データ入力を表すコンテナです。値を読み取るたびに、それを消費し、必要に応じてポインタを前方に移動します。これらの制約を汎用イテレーターに課すと、反復子の汎用性が失われます。

previous提案されているように、メソッドが必要な場合は、を使用ListIterator<>します。これは、リストとして動作するコンテナーに制限されます。

于 2008-10-10T18:48:31.217 に答える
3

私が注目したいのは、clojure での Seq の実装です。

http://clojure.org/sequences

基本クラスの実装は Java であり、完全なソースが利用可能です。Seq は Java イテレーター (Java イテレーター インターフェイスを取り、実装する) のデコレーターですが、独自のインターフェイスも提供します。

于 2008-10-10T18:00:09.257 に答える
2

誰かが Google Collections にリンクしているのを見ましたが、あなたが探しているメソッドが Iterators.peekingIterator() と呼ばれていることを誰も言及していません。

それでも、ListIterator を使用できれば最高です。

于 2009-11-04T01:56:17.167 に答える
1
public class Iterazor<T> {
  private Iterator<T> it;
  public T top;
  public Iterazor(Collection<T> co) {
    this.it = co.iterator(); 
    top = it.hasNext()? it.next(): null; 
  }
  public void advance() { 
    top = it.hasNext()? it.next(): null; 
  }
}

// usage

for(Iterazor<MyObject> iz = new Iterazor<MyObject>(MyCollection); 
    iz.top!=null; iz.advance())
  iz.top.doStuff();
}
于 2009-03-05T05:49:13.760 に答える
1

ykaganovichが示唆したように、あなたはgoogle-collectionsのものをチェックしたいかもしれません。覗き見など、必要なもののいくつかには間違いなくサポートがあります。また、他の人が言及しているように、すべてのコレクションにこれらすべてを実装することは、可能性またはパフォーマンスの観点から危険な場合があります。

于 2008-10-10T18:51:00.120 に答える
0

スタックを使用したほうがよいようです。

于 2008-10-10T18:38:22.720 に答える
0

Java コレクションは、有用な機能の最小限のセットを提供するために作成されました。これは、 Java を実装する人が実装する必要があるコードにとって非常に優れたアプローチです。便利な機能を備えたインターフェイスを肥大化させると、コードの量が大幅に増加する可能性があり、改善に気付くのはごくわずかです。peek() と previous() が標準イテレータの一部であった場合、新しい種類の Collection を作成するすべての人は、それが賢明かどうかにかかわらず、それを実装する必要があります。

イテレータは、物理的に後戻りできないものに対しても機能するように設計されているため、peek() と previous() の両方が不可能になります。

于 2008-11-18T16:33:24.963 に答える
0

peek(); が必要な問題に遭遇したことはありません。Iterator は私にとってはうまくいきました。この追加機能が必要だと感じているイテレータをどのように使用しているかに興味があります。

于 2008-10-10T17:59:14.063 に答える