Rimuovere scala (in luogo) tutti gli elementi di un ListBuffer che soddisfano una condizione

StackOverflow https://stackoverflow.com/questions/4417994

  •  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?

È stato utile?

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