Domanda

Ho un SortedSet (in particolare un TreeSet) contenente gli aggiornamenti. Un aggiornamento è qualcosa come uno SVN commit, Facebook Share parete, nuovo biglietto Trac, ecc sto memorizzare questi in un SortedSet perché:

  • Ordinati:. Gli aggiornamenti devono essere ordinato per data, scendendo
  • Set:. Quando recupero gli ultimi aggiornamenti da un'origine di aggiornamento, io di solito ricevere gli aggiornamenti che sono già nel set

Ora, dopo un po 'il set crescerà davvero enorme, quindi mi piacerebbe rimuovere qualsiasi cosa ma i primi elementi di X dal set (perché gli altri non saranno visualizzati in ogni caso). Come posso fare questo, dal momento che non è un List?

È stato utile?

Soluzione

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

Altri suggerimenti

La soluzione qui dovrebbe dipendere dal fatto se avete bisogno dei dati di "extra" in futuro. Se avete bisogno della vostra soluzione basata su ulteriore elenco è ok. In caso contrario, io suggerirei il seguente:

Crea il tuo set ordinato che estende la java.util.SortedSet e sostituisce il suo metodo add (). Questo metodo dovrebbe fare nulla dopo un certo limite. In alternativa è possibile creare "wrapper" Set che contiene set di carico utile e delegati tutti i metodi tranne add (). Il metodo add () deve delegare la sua richiesta solo se il formato del set payload è inferiore al limite prestabilito. Questo è il modo in FixedSizeSortedMap di collezione jakarta funziona il quadro, quindi si può semplicemente utilizzare esso.

La risposta accettata in realtà non efficiente O (ln n) perché utilizza la funzione di rimozione. Qui è uno migliore in quanto pollLast() è O (1) e la dimensione è O (1) . Complessità sarà influenzata solo dal formato finale.

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

La mia soluzione è:

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

Ecco un metodo soluzione di lavoro per Java, dato un TreeSet Risultati , e una variabile size specificando le dimensioni del set risultante:

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top