Editar: Se agregó el hecho de que la lista está ordenada, y darse cuenta de que 'duplicado' es engañoso, reemplazó eso con 'redundante' en el título.Eliminar entradas redundantes, scala way
Tengo una lista ordenada de entradas que indican un valor de producción en un intervalo determinado. Las entradas que indican el mismo valor en un momento posterior no agregan información y pueden omitirse de manera segura.
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))
Experimentando con las funciones de recaudación Scala 2.8, hasta ahora tengo esta implementación trabajo:
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))
Cualquier comentario? ¿Me estoy perdiendo algo de magia scala?
Eso sí, 'foldRight' no es óptimo con' List'. Prefiero 'foldLeft' con él.Esto es lo opuesto a 'Haskell', donde' Right' se prefiere a 'Left' debido a la falta de rigor. –
bien, pero luego necesito revertir el resultado. Ejecutar una prueba rápida coloca foldRight ligeramente por delante de foldLeft + reverse, por lo que diría foldRight es más claro. – andersbohn