Rimuovere scala (in luogo) tutti gli elementi di un ListBuffer che soddisfano una condizione
-
08-10-2019 - |
Domanda
Ho un ListBuffer. Voglio rimuovere tutti gli elementi che soddisfano una determinata condizione.
ho potuto scorrere su di esso e rimuovere ogni elemento. Ma ciò che doe Scala dire di mutare una lista che si effettua l'iterazione? Funzionerà, o sarà eliminare gli elementi sbagliati / non restituire tutti gli elementi? (Un tentativo veloce con il REPL suggerisce che sì, lo farà rovinare)
ho potuto chiamare ripetutamente trovare e quindi rimuovere l'elemento presente fino a quando non trovo più, ma che suoni inefficiente.
.filter tornerà me una nuova ListBuffer senza gli elementi, ma voglio farlo al suo posto.
Questo
def --= (xs: TraversableOnce[A]) : ListBuffer.this.type
Removes all elements produced by an iterator from this list buffer.
sembra essere molto promettente, ma io non riesco a vedere come usarlo qui
Come devo fare questo?
Soluzione
Non si può fare questo in modo efficace, purtroppo. L'implementazione di --=(xs: TraversableOnce[A])
è (in forma espansa, il codice effettivo è più compatto)
xs foreach (x => this -= x) ; this
che è altrettanto inefficiente come farlo uno alla volta (vale a dire di essa la O(n*m)
dove n
è la lunghezza della lista originale e m
è il numero di elementi da rimuovere).
In generale, le collezioni mutevoli non hanno come un insieme completo e potente di metodi come quelli immutabili. (Cioè, di avere tutti i metodi utilizzati meravigliosi su collezioni immutabili, ma relativamente pochi di loro.)
Quindi, a meno che non si sta rimuovendo molto alcuni oggetti, è probabilmente stai meglio filtrare l'elenco per crearne uno nuovo.
Altri suggerimenti
È possibile combinare le due cose e fare quanto segue:
val lb = ListBuffer(1,2,3,4,5,6)
lb --= lb.filter(_ % 2 == 0)
println(lb)
// outputs: ListBuffer(1, 3, 5)