Modifica: aggiunto il fatto che la lista è ordinata e la realizzazione di "duplicati" è fuorviante, sostituita con "ridondante" nel titolo.Rimuovi voci ridondanti, scala
Ho un elenco ordinato di voci che indica un valore di produzione in un dato intervallo. Le voci che indicano lo stesso identico valore in un secondo momento non aggiungono informazioni e possono essere tralasciate in modo sicuro.
case class Entry(minute:Int, production:Double)
val entries = List(Entry(0, 100.0), Entry(5, 100.0), Entry(10, 100.0), Entry(20, 120.0), Entry(30, 100.0), Entry(180, 0.0))
Sperimentare con le funzioni di raccolta Scala 2.8, fino ad ora ho questa implementazione di lavoro:
entries.foldRight(List[Entry]()) {
(entry, list) => list match {
case head :: tail if (entry.production == head.production) => entry :: tail
case head :: tail => entry :: list
case List() => entry :: List()
}
}
res0: List[Entry] = List(Entry(0,100.0), Entry(20,120.0), Entry(30,100.0), Entry(180,0.0))
Eventuali commenti? Mi sto perdendo un po 'di scala magica?
Attenzione, 'foldRight' non è ottimale con' List'. Preferisci 'foldLeft' con esso.Questo è l'opposto di 'Haskell', dove' Right' è preferito su 'Left' a causa della non-severità. –
ok, ma poi ho bisogno di invertire il risultato. L'esecuzione di un test rapido pone foldRight leggermente più avanti rispetto a foldLeft + reverse, quindi direi foldRight è più chiaro. – andersbohn