Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- val newMap = Map[String, Double]() /: listOfMaps { (accumulator, m) => ... }
- def mergeMap[A, B](ms: List[Map[A, B]])(f: (B, B) => B): Map[A, B] =
- (Map[A, B]() /: (for (m <- ms; kv <- m) yield kv)) { (a, kv) =>
- a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv)
- }
- val ms = List(Map("hello" -> 1.1, "world" -> 2.2), Map("goodbye" -> 3.3, "hello" -> 4.4))
- val mm = mergeMap(ms)((v1, v2) => v1 + v2)
- println(mm) // prints Map(hello -> 5.5, world -> 2.2, goodbye -> 3.3)
- mapList reduce (_ ++ _)
- def combine(m1: Map, m2: Map): Map = {
- val k1 = Set(m1.keysIterator.toList: _*)
- val k2 = Set(m2.keysIterator.toList: _*)
- val intersection = k1 & k2
- val r1 = for(key <- intersection) yield (key -> (m1(key) + m2(key)))
- val r2 = m1.filterKeys(!intersection.contains(_)) ++ m2.filterKeys(!intersection.contains(_))
- r2 ++ r1
- }
- class CombiningMap(m1: Map[Symbol, Double]) {
- def combine(m2: Map[Symbol, Double]) = {
- val k1 = Set(m1.keysIterator.toList: _*)
- val k2 = Set(m2.keysIterator.toList: _*)
- val intersection = k1 & k2
- val r1 = for(key <- intersection) yield (key -> (m1(key) + m2(key)))
- val r2 = m1.filterKeys(!intersection.contains(_)) ++ m2.filterKeys(!intersection.contains(_))
- r2 ++ r1
- }
- }
- // Then use this:
- implicit def toCombining(m: Map[Symbol, Double]) = new CombiningMap(m)
- // And finish with:
- mapList reduce (_ combine _)
- def mergeMaps[A,B](collisionFunc: (B,B) => B)(listOfMaps: Seq[scala.collection.Map[A,B]]): Map[A, B] = {
- listOfMaps.foldLeft(Map[A, B]()) { (m, s) =>
- Map(
- s.projection.map { pair =>
- if (m contains pair._1)
- (pair._1, collisionFunc(m(pair._1), pair._2))
- else
- pair
- }.force.toList:_*)
- }
- }
- def mergeMaps[A,B](collisionFunc: (B,B) => B)(listOfMaps: List[mutable.Map[A,B]]): mutable.Map[A, B] = {
- listOfMaps.foldLeft(mutable.Map[A,B]()) {
- (m, s) =>
- for (k <- s.keys) {
- if (m contains k)
- m(k) = collisionFunc(m(k), s(k))
- else
- m(k) = s(k)
- }
- m
- }
- }
Add Comment
Please, Sign In to add comment