5

注文したデータを保持する SortedSet があります。

メソッドを使用し.first()て最初のレコードを返し、それを別のウィンドウに渡します。
他のウィンドウが終了すると、呼び出されたイベントが発生し、SortedSet からウィンドウに次のイベントを渡したいのですが、次の要素に移動するにはどうすればよいですか?

launchWindow(this.set.first());

それから私はこれを持っています:

onActivityResult(...) {
 if (this.set.hasNext()) launchWindow(this.set.next());//hasNext/next doesn't exists in the current context for SortedSet
}

どのようなオプションがありますか?

4

4 に答える 4

3

Set の代わりに Iterator を渡す必要があり、次の消費者は next() を呼び出すだけです

于 2010-05-27T20:54:55.223 に答える
3

Iteratorで使いたくないですSortedSetか?

于 2010-05-27T20:56:05.023 に答える
2

イテレータ ソリューション:

おそらく次のようなものが必要です。

class WindowLauncherClass {

   SortedSet set = null;
   Iterator setIterator = null;

   public WindowLauncherClass(SortedSet set) {
      this.set = set; // or you can copy it if that's what you need.
   }

   protected void launchWindow(Object item) {
     // impl 
   }

   public void onActivityResult() {
      if ( setIterator != null && setIterator.hasNext() ) 
      {   
         launchWindow(setIterator.next());
      }
   }

   public void start() {
       setIterator = set.iterator();
       onActivityResult();
   }
}

コメントには、セットの更新に関する質問がありました。イテレータはそれを認識しますか?. 通常の答えは、アプリケーションの要件によって異なります。この場合、私はすべての情報を持っているわけではないので、推測してみます。

  1. jdk 1.5 までは、SortedSet 実装 ( TreeSet ) が 1 つしかありませんでした。これには、フェイル ファスト イテレータがありました。

  2. jdk 6 では、新しい実装である ConcurrentSkipListSet が登場しました。このソートされたセットの反復子は、フェイル ファストではありません。

現在表示されている要素よりも「小さい」要素をセットに追加している場合、「適切な」(フェイル ファストではない) イテレータからはそれを確認できません。現在表示されている要素よりも「大きい」要素を追加する場合は、適切な反復子によって表示されます。

最終的な解決策は、適切な変更が作成されたときにセットと反復子を実際にリセットすることです。最初に ConcurrentSkipListSet を使用すると、「より大きな」変更のみが表示され、TreeSet を使用すると、すべての更新で失敗します。

現在のものより「小さい」更新を見逃す余裕がある場合は、jdk 6.0 と ConcurrentSkipListSet を使用してください。そうでない場合は、表示したものを追跡し、新しいアイテムと非表示のアイテムで適切なセットを再構築する必要があります。

于 2010-05-27T21:05:08.983 に答える
2

SortedSetサードパーティのライブラリの一部を使用していない限り、セットもNavigableSet(every SortedSetin java.utilalso implements NavigableSet) です。イベントが作業を終了したばかりの要素を返すようにできる場合、渡した要素よりも上位の次の要素を取得NavigableSetするメソッドがhigherになります。

public void onActivityResult(Event event) {
  Element element = event.processedElement;
  Element next = set.higher(element);

  if(next != null)
    launchWindow(next);
}
于 2010-05-27T21:00:04.910 に答える