如何在函数样式中添加列表中选择行的值?
发布时间:2020-12-16 18:26:35 所属栏目:安全 来源:网络整理
导读:我以命令式的方式解决了我的问题,但它看起来非常难看.我怎样才能做得更好(更优雅,更简洁,更实用 – 最后是 Scala).应跳过与前一行具有相同值但具有不同字母的行,应添加行的所有其他值. val row1 = new Row(20,"A",true) // add value val row2 = new Row(30,
我以命令式的方式解决了我的问题,但它看起来非常难看.我怎样才能做得更好(更优雅,更简洁,更实用 – 最后是
Scala).应跳过与前一行具有相同值但具有不同字母的行,应添加行的所有其他值.
val row1 = new Row(20,"A",true) // add value val row2 = new Row(30,true) // add value val row3 = new Row(40,true) // add value val row4 = new Row(40,"B",true) // same value as the previous element & different letter -> skip row val row5 = new Row(60,true) // add value val row6 = new Row(70,true) // add value val row7 = new Row(70,true) // same value as the previous element,but the same letter -> add value val rows = List(row1,row2,row3,row4,row5,row6,row7) var previousLetter = " " var previousValue = 0.00 var countSkip = 0 for (row <- rows) { if (row.value == previousValue && row.letter != previousLetter) { row.relevant = false countSkip += 1 } previousLetter = row.letter previousValue = row.value } // get 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) 提前致谢 Twistleton 解决方法
减少它:
rows.reduceLeft { (prev,curr) => if (prev.value == curr.value && prev.letter != curr.letter) { curr.relevant = false countSkip += 1 } curr } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |