scala - How do add values of selective rows from a list in an functional style? -
i solved problem in imperative style, looks ugly. how can make better (more elegant, more concise, more functional - scala). rows same values previous row, different letter should skipped, other values of rows should added.
val row1 = new row(20, "a", true) // add value val row2 = new row(30, "a", true) // add value val row3 = new row(40, "a", true) // add value val row4 = new row(40, "b", true) // same value previous element & different letter -> skip row val row5 = new row(60, "b", true) // add value val row6 = new row(70, "b", true) // add value val row7 = new row(70, "b", true) // same value previous element, same letter -> add value val rows = list(row1, row2, row3, row4, row5, row6, row7) var previousletter = " " var previousvalue = 0.00 var countskip = 0 (row <- rows) { if (row.value == previousvalue && row.letter != previousletter) { row.relevant = false countskip += 1 } previousletter = row.letter previousvalue = row.value } // sum val sumvalue = rows.filter(_.relevant == true).map(_.value) reduceleftoption(_ + _) val sum = sumvalue match { case some(d) => d case none => 0.00 } assert(sum == 290) assert(countskip == 1)
thanks in advance
twistleton
reduce it:
rows.reduceleft { (prev, curr) => if (prev.value == curr.value && prev.letter != curr.letter) { curr.relevant = false countskip += 1 } curr }
Comments
Post a Comment