Я думаю, вы делаете это неправильно. Не создавайте Map
напрямую: создайте последовательность. В этом случае ListBuffer
, вероятно, является наиболее подходящим, так что вы можете легко добавлять элементы к нему. Он также поддерживает постоянное время toList
, хотя это не должно иметь значения.
Если вам нужен функциональный подход, вы можете либо добавить к List
и reverse
это, либо пойти по пути повторений . Мне не совсем удобно с последним объяснять их.
Как только вы получите свою коллекцию, вы ее scanLeft
. Или, если вы построили List
, вы могли бы scanRight
вместо того, чтобы reverse
. После этого просто вызвать toMap
для результата.
Грубо говоря:
var accum: List[(Int, Int)] = Nil
accum ::= 36 -> 110
accum ::= 35 -> 90
accum ::= 34 -> 80
accum ::= 33 -> 60
val orders = accum.scanRight(0 -> 0) {
case ((k, v), (_, acc)) => (k, v + acc)
}.init.toMap
init
опускает семя. Я мог бы избежать необходимости делать это, используя tail
и head
, но для этого потребовалась бы проверка, чтобы определить, является ли accum
пустым.
var
можно удалить, используя итерации, или, возможно, используя монаду состояния на более высоком уровне.