Ritaglio di un set ordinato
-
28-09-2019 - |
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
?
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
}