0

我有一个像这样的地图:

Map("product1" -> List(Product1ObjectTypes), "product2" -> List(Product2ObjectTypes))

哪里ProductObjectType有一个字段usage。基于其他字段 ( counter) 我必须更新所有ProductXObjectTypes.

问题是此更新取决于previous ,并且在迭代此地图ProductObjectType时我找不到获取上一个项目的方法。mapValues所以基本上,要更新usage我需要的电流:CurrentProduct1ObjectType.counter - PreviousProduct1ObjectType.counter.

有没有办法做到这一点?

我开始这样:

val reportsWithCalculatedUsage =
  reportsRefined.flatten.flatten.toList.groupBy(_._2.product).mapValues(f)

但我不知道mapValues如何访问上一个列表项。

4

2 回答 2

2

请注意,常规地图是无序的集合,您需要使用 TreeMap 之类的东西来获得可预测的迭代顺序。

无论如何,据我了解,您希望在地图中获得所有值对。尝试这样的事情:

scala> val map = Map(1 -> 2, 2 -> 3, 3 -> 4)
scala> (map, map.tail).zipped.foreach((t1, t2) => println(t1 + " " + t2))
(1,2) (2,3)
(2,3) (3,4)
于 2013-02-02T12:52:27.590 回答
2

我不确定我是否完全理解,但是如果您想根据其前身更新列表中的值,通常可以通过折叠来完成:

case class Thing(product: String, usage: Int, counter: Int)

val m = Map(
  "product1" -> List(Thing("Fnord", 10, 3), Thing("Meep", 0, 5))
  //... more mappings
)

//> Map(product1 -> List(Thing(Fnord,10,3), Thing(Meep,0,5)))

m mapValues { list => list.foldLeft(List[Thing]()){
  case (Nil, head) =>
    List(head)
  case (tail, head) =>
    val previous = tail.head
    val current = head copy (usage = head.usage + head.counter - previous.counter)
    current :: tail
} reverse }

//> Map(product1 -> List(Thing(Fnord,10,3), Thing(Meep,2,5)))
于 2013-02-02T13:06:49.433 回答