Frage

habe ich ein SortedSet (speziell ein TreeSet) enthält Updates. Ein Update ist so etwas wie ein SVN begehen, Facebook-Pinnwand posten, neu Trac Ticket, etc. Ich bin dies in einem SortedSet weil Speicherung:

  • Sortiert:. Die Updates müssen nach Datum sortiert werden, absteigend
  • Set:. Wenn Sie das neueste Updates von einer Update-Quelle zu holen, werde ich in der Regel Updates erhalten, die bereits in dem Satz

Nun, nach einer Weile des Satz wirklich riesig wachsen wird, so dass ich alles löschen möchte aber die ersten X Elemente aus dem Satz (weil andere nicht ohnehin angezeigt). Wie kann ich dies tun, da es kein List ist?

War es hilfreich?

Lösung

While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}

Andere Tipps

Die Lösung soll dabei von der Tatsache abhängen, ob die „extra“ Daten in Zukunft benötigen. Wenn Sie Ihre Lösung benötigen zusätzliche Liste basiert ist ok. Wenn nicht, würde ich vorschlagen, das folgende:

Erstellen Sie Ihren eigenen sortierten Satz, den die java.util.SortedSet erweitert und überschreibt seine Methode add (). Diese Methode soll nichts nach bestimmten Grenze tun. Alternativ können Sie „Wrapper“ Set erstellen, die Nutzlast-Set und delegiert alle Methoden außer Add hält (). Die add () Methode sollte seine Forderung überträgt nur dann, wenn eine Größe der Nutzlast Satzes geringer ist als der vorgegebene Grenzwert. Dies ist, wie FixedSizeSortedMap Jakartas Werke Sammlung Rahmen, so können Sie nur nutzen es.

Die akzeptierte Antwort nicht wirklich effizient O (ln n) , weil es entfernt Funktion verwendet. Hier ist ein besseres, da pollLast() ist O (1) und Größe ist O (1) . Komplexität wird nur durch Endformat beeinflusst werden.

While(mySet.size() > limit) {
  mySet.pollLast();
}

Meine eigene Abhilfe ist:

        List<Update> trimmed = new ArrayList<Update>(20);
        int i = 0;
        for (Update u : updates) {
            trimmed.add(u);
            i++;
            if (i > 20) break;
        }
        updates = new TreeSet<Update>(trimmed);

Hier ist eine Arbeitslösungsverfahren für Java, da ein TreeSet Ergebnisse , und eine Variable Größe die Größe der Ergebnismenge festgelegt wird:

void setLimit(Set<T> resutls, int size) {
    List<T> items = new ArrayList<T>();
    items.addAll(resutls);
    resutls.clear();
    int trim = size>items.size() ? items.size() : size;
    resutls.addAll(items.subList(0,trim));
    // return results; // optionally, if required
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top