5 Stimmen

Wie erhält man das nächste Element eines SortedSet?

Ich habe ein SortedSet, das meine geordneten Daten enthält.

Ich benutze die .first() um den ersten Datensatz zurückzugeben und ihn an ein anderes Fenster zu übergeben.
Wenn das andere Fenster beendet, bekomme ich ein Ereignis aufgerufen, und ich möchte die nächste aus dem SortedSet an das Fenster übergeben, so wie zum nächsten Element zu bewegen?

launchWindow(this.set.first());

Dann habe ich das hier:

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

Welche Möglichkeiten habe ich?

3voto

Eugene Kuleshov Punkte 30863

Anstelle der Menge sollten Sie den Iterator übergeben, dann würde der nächste Verbraucher einfach next() aufrufen.

3voto

Amir Afghani Punkte 36713

Wollen Sie nicht eine Iterator über die SortedSet ?

2voto

jasonmp85 Punkte 6619

Es sei denn, Sie verwenden eine SortedSet aus einer Bibliothek eines Drittanbieters, ist Ihr Set auch ein NavigableSet (jede SortedSet en java.util implementiert auch NavigableSet ). Wenn Sie das Ereignis dazu bringen können, das Element zurückzugeben, an dem es gerade gearbeitet hat, NavigableSet hat eine Methode höher wodurch das nächsthöhere Element als das, das Sie einreichen, erhalten wird:

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

  if(next != null)
    launchWindow(next);
}

2voto

Mihai Toader Punkte 11831

Die Iterator-Lösung:

Wahrscheinlich sollten Sie etwas in dieser Art haben:

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

In den Kommentaren erschien die Frage nach Aktualisierungen der Menge. Wird der Iterator sie sehen? Die normale Antwort lautet: Das hängt von den Anforderungen der Anwendung ab. In diesem Fall habe ich nicht alle Informationen und ich werde versuchen, zu erraten.

  1. Bis jdk 1.5 gab es nur eine SortedSet-Implementierung (TreeSet). Diese hatte einen Fail Fast Iterator.

  2. in jdk 6 erschien eine neue Implementierung: ConcurrentSkipListSet. Der Iterator für diese sortierte Menge ist nicht ausfallsicher.

Wenn Sie ein Element in die Menge hinzufügen, das "kleiner" ist als das aktuell angezeigte Element, dann können Sie es mit einem "guten" (nicht ausfallsicheren) Iterator ohnehin nicht sehen. Wenn Sie ein Element hinzufügen, das "größer" ist als das aktuell angezeigte Element, können Sie es mit einem geeigneten Iterator sehen.

Die endgültige Lösung besteht darin, die Menge und den Iterator zurückzusetzen, wenn eine richtige Änderung vorgenommen wird. Wenn Sie ein ConcurrentSkipListSet verwenden, sehen Sie zunächst nur die "größeren" Änderungen, und wenn Sie ein TreeSet verwenden, schlagen Sie bei jeder Aktualisierung fehl.

Wenn Sie es sich leisten können, Updates zu verpassen, die "kleiner" sind als die aktuellen, dann entscheiden Sie sich für jdk 6.0 und ConcurrentSkipListSet. Wenn nicht, als Sie haben, um zu verfolgen, was Sie angezeigt und eine richtige Menge mit neuen Elementen und nicht angezeigten Elemente neu zu erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X