Frage

In Java habe ich eine SortedSet, die 100.000 Elemente aufweisen. Ich möchte effizient und elegant die letzten 25 Elemente erhalten. Ich bin ein wenig verwirrt.

Um die zuerst bekommen 25 Ich würde durchlaufen und nach 25 Elementen stoppen. Aber ich weiß nicht, wie in umgekehrter Reihenfolge zu durchlaufen. Irgendwelche Ideen?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
War es hilfreich?

Lösung

Sie benötigen einen NavigableSet. Sonst werden Sie es uneffizient zu tun haben, durch den ganzen SortedSet laufen und Elemente in ein Queue sammeln, die Sie bei 25 Elementen getrimmt halten.

Andere Tipps

SortedSet<T> entworfen wurde, ein sehr einfache Iteration Modell unter der Annahme, nur vorwärts, so dass die Top-n-Einträge zu finden, ist einfach, aber die letzten finden würde eine teure Lese durch den Iterator erfordert ein Fenster der letzten n Einträge beibehalten wird.

NavigableSet<T> Zugabe in 1.6 löst diese (und die einzige SortedSet Implementierung von 1,4 TreeSet implementiert es so ist es wahrscheinlich ein direkter Ersatz für Sie sein).

NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed

umkehren Ihre Art und nehmen die ersten 25 Elemente. Sie können dann diejenigen umkehren, die als einzige 25 Elemente effizient sein wird.

Bruce

Eine andere Datenstruktur wäre besser geeignet für diesen Vorgang.

Dies ist nicht eine elegante Art und Weise oder sehr effizient , aber die SortedSet Annahme ist aufsteigend könnten Sie die Last () Einzelteil erhalten, und entfernen Sie es, mich in einer anderen Liste zu speichern, und 25-mal wiederholen . Sie würden dann diese Elemente wieder setzen müssen!

Sie können einen Blick auf IndexedTreeMap in indiziert-tree-Karte

Genaues (Größe-25) mit dem Element bei Index ohne Iteration zu erhalten.

Werfen Sie das Set in einer Liste und verwenden subList (). Ich bin mir nicht sicher, wie performant es ist, die Liste zu erstellen, so dass Sie müßten einige Tests laufen. Es wäre sicherlich die Codierung leicht machen though.

    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );

Ich gehe davon aus, dass dies unwahrscheinlich ist, jeder realer Einsatz in einem Projekt sein, aber es ist erwähnenswert, dass man einfach die Liste zu haben, anstatt in der entgegengesetzten Richtung sortierte möglicherweise in der Lage:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top