Cristian Boariu
Cristian Boariu

Reputation: 9621

Update values of Map

I have a Map like:

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

where ProductObjectType has a field usage. Based on the other field (counter) I have to update all ProductXObjectTypes.

The issue is that this update depends on previous ProductObjectType, and I can't find a way to get previous item when iterating over mapValues of this map. So basically, to update current usage I need: CurrentProduct1ObjectType.counter - PreviousProduct1ObjectType.counter.

Is there any way to do this?

I started it like:

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

but I don't know in mapValues how to access previous list item.

Upvotes: 0

Views: 170

Answers (2)

user500592
user500592

Reputation:

I'm not sure if I understand completely, but if you want to update the values inside the lists based on their predecessors, this can generally be done with a fold:

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)))

Upvotes: 2

Denis Tulskiy
Denis Tulskiy

Reputation: 19187

Note that regular map is an unordered collection, you need to use something like TreeMap to have predictable order of iteration.

Anyways, from what I understand you want to get pairs of all values in a map. Try something like this:

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)

Upvotes: 2

Related Questions