Edycja: Dodano fakt, że lista jest posortowana, a wykonanie "duplikatu" wprowadza w błąd, zastąpiło to "nadmiarowym" w tytule.Usuwanie zbędnych wpisów, sposób scala
Mam posortowaną listę wpisów określającą wartość produkcji w danym przedziale. Wpisy zawierające taką samą wartość w późniejszym czasie nie zawierają żadnych informacji i można je bezpiecznie pominąć.
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))
Eksperymentowanie z funkcjami scala 2,8 zbiórki, do tej pory mam to realizację pracy:
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))
jakieś uwagi? Czy brakuje mi jakiejś magii scala?
Pamiętaj, że 'foldRight' jest nieoptymalne w przypadku' List'. Preferuj 'foldLeft' z tym.Jest to przeciwieństwo 'Haskell', gdzie' Right' jest preferowany zamiast 'Left' ze względu na nie-stricte. –
ok, ale potem muszę odwrócić wynik. Uruchomienie szybkiego testu stawia foldRight nieco przed foldLeft + reverse, więc powiedziałbym, że foldRight jest bardziej przejrzysty. – andersbohn