I am trying iterate an list and then doing an range check on each item and cumalating scores accordingly.
Pretty straight forward. I feel like i am doing this in more traditional way and creating lot of "var" variables..
Is there an effective functional/immutable way of achieving this behavior?
var score_1 = 0
var score_2 = 0
var score_3 = 0
var score_4 = 0
var score_5 = 0
val list = List(1,1,1,0.8,0.75,0.7,0.7,0.5,0.4,0.25,0.2,0.15,0.1)
list.foreach( i => {
i.toDouble match {
case x if( x == 1.0 ) => score_1 += 1
case x if( x >= 0.75 && x < 1 ) => score_2 += 1
case x if( x >= 0.50 && x < 0.75) => score_3 += 1
case x if( x >= 0.25 && x < 0.50) => score_4 += 1
case x if( x >= 0 && x < 0.25 ) => score_5 += 1
case _ =>
}
})
println(score_1,score_2,score_3,score_4,score_5)
Yes you can achieve immutability using foldLeft
,
case class Score(score1: Int,
score2: Int,
score3: Int,
score4: Int,
score5: Int,
score6: Int,
score7: Int,
score8: Int)
object Score {
def empty = new Score(0, 0, 0, 0, 0, 0, 0, 0)
}
val myScore = list.foldLeft(Score.empty) {
case (score, 1.0) => score.copy(score1 = score.score1 + 1)
case (score, x) if x > 0.75 && x < 1 => score.copy(score2 = score.score2 + 1)
case (score, 0.75) => score.copy(score3 = score.score3 + 1)
case (score, x) if x > 0.50 && x < 0.75 => score.copy(score4 = score.score4 + 1)
case (score, 0.50) => score.copy(score5 = score.score5 + 1)
case (score, x) if x > 0.25 && x < 0.50 => score.copy(score6 = score.score6 + 1)
case (score, 0.25) => score.copy(score7 = score.score7 + 1)
case (score, x) if x >= 0 && x < 0.25 => score.copy(score8 = score.score8 + 1)
case (score, _) => score
}
println(myScore) // Score(3,1,1,2,1,1,1,3)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加