如何从(键,值)对的值中找到百分比?

时间:2019-01-22 09:05:47

标签: scala

我想从存储在地图中的键值对中找到一个百分比。 例如:Map('a'-> 10,'b'-> 20)。我需要找到'a'和'b'的出现百分比

3 个答案:

答案 0 :(得分:3)

除了Thilo的答案外,您还可以尝试以下代码。最终结果将再次为Map[String, Double]

val map = Map("a" -> 10.0, "b" -> 20.0)
val total = map.values.sum
val mapWithPerc = map.mapValues(x => (x * 100) / total)
println(mapWithPerc)

//prints Map(a -> 33.333333333333336, b -> 66.66666666666667)

答案 1 :(得分:1)

def mapToPercentage(key: String)(implicit map: Map[String, Double]) = {
   val valuesSum = map.values.sum
   (map(key) * 100) / valuesSum
}

implicit val m: Map[String, Double] = Map("a" -> 10, "b" -> 20, "c" -> 30)

println(mapToPercentage("a")) // 16.666666666666668
println(mapToPercentage("b")) // 33.333333333333336
println(mapToPercentage("c")) // 50

See demo here

注意:绝对没有必要使用函数参数或将地图设为隐式。我只是认为在此示例中看起来更好。 def mapToPercentage(key: String, map: Map[String, Double]) = {...}mapToPercentage("a", m)之类的东西也完全有效。话虽如此,如果您想变得更高级:

implicit class MapToPercentage (map: Map[String, Double]) {
  def getPercentage(key: String) = {
    val valuesSum = map.values.sum
    (map(key) * 100) / valuesSum
  }
}    

val m: Map[String, Double] = Map("a" -> 10, "b" -> 20, "c" -> 30)

println(m.getPercentage("a")) // 16.666666666666668
println(m.getPercentage("b")) // 33.333333333333336
println(m.getPercentage("c")) // 50

See demo here

要点是,获取百分比背后的逻辑可以通过以下几种方式编写:

(map(key) * 100) / valuesSum // get the value corresponding to a given key,
                             // multiply by 100, divide by total sum or all values
                             // - will complain if key doesn't exist

(map.getOrElse(key, 0D) * 100) / valuesSum // more safe than above, will not fail
                                           // if key doesn't exist

map.get(key).map(_ * 100 / valuesSum) // will return None if key doesn't exist
                                      // and Some(result) if key does exist

答案 2 :(得分:-1)

val map = Map('a' -> 10, 'b' -> 20)

val total = map.values.sum

map.get('a').map(_ * 100 / total)  // gives Some(33)