加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在函数样式中添加列表中选择行的值?

发布时间: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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读