如何计算SortedMap / TreeMap的运行总计

时间:2019-07-17 19:17:44

标签: scala dictionary

所以我有以下SortedMap

val mySortedMap: SortedMap[Double, Int] = SortedMap(1.1 -> 7, 2.4 -> 3, 6.5 -> 12)

现在我需要计算每个键的运行总计,因此输出应如下所示:

val result: SortedMap[Double, Int] = SortedMap(1.1 -> 7, 2.4 -> 10, 6.5 -> 22)

我知道我可以使用scanLeft做类似的事情:

val result: Iterable[Int] = mySortedMap.scanLeft(0)((c, e) => c + e._2)

但这返回Iterable,而我需要保持上面指定的SortedMap。最具功能/最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用foldLeft,其中您的累加器既是新的 SortedMap ,又是运行总计。

import scala.collection.immutable.SortedMap

def runningTotal(map: SortedMap[Double, Int]): SortedMap[Double, Int] = {
  val (transformed, _) = map.foldLeft((SortedMap.empty[Double, Int], 0)) {
    (acc, element) =>
      val (mapAcc, totalAcc) = acc
      val (key, value) = element
      val newTotal = totalAcc + value
      val newMap = mapAcc + (key -> newTotal)
      (newMap, newTotal)
  }
  transformed
}

奖金,这是您的解决方案,但是使用 Iterators 代替,因此效率会更高。

def runningTotal(map: SortedMap[Double, Int]): SortedMap[Double, Int] = {
  val newValues = map.valuesIterator.scanLeft(0) {
    (acc, value) => acc + value
  }.drop(1)

  map.keysIterator.zip(newValues).to(SortedMap)
}

答案 1 :(得分:0)

好的,我想我可能已经找到了一种可能的解决方案:

val input: SortedMap[Double, Int] = SortedMap(1.1 -> 7, 2.4 -> 3, 6.5 -> 12)
val aggregates: Iterable[Int] = mySortedMap.scanLeft(0)((c, e) => c + e._2).tail
val sortedAggregates: SortedMap[Double, Int] = input.keySet.zip(aggregates).to(SortedMap)
println(sortedAggregates)

给予TreeMap(1.1 -> 7, 2.4 -> 10, 6.5 -> 22)

我想知道是否有更好的方法?