0

私は次のような地図を持っています:

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

ここProductObjectTypeにフィールドがありますusage。他のフィールド()に基づいて、counterすべてを更新する必要がありますProductXObjectTypes

問題は、この更新が以前 のものに依存していることであり、このマップを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 に答える