在Scala中合并两个LinkedHashMap

在Scala中合并两个LinkedHashMap,scala,dictionary,merge,linkedhashmap,Scala,Dictionary,Merge,Linkedhashmap,有这个代码吗 def mergeWith[K, X, Y, Z](xs: mutable.LinkedHashMap[K, X], ys: mutable.LinkedHashMap[K, Y])(f: (X, Y) => Z): mutable.LinkedHashMap[K, Z] = xs.flatMap { case (k, x) => ys.get(k).map(k -> f(x, _)) } 它给了我这个: val map1 = LinkedHas

有这个代码吗

def mergeWith[K, X, Y, Z](xs: mutable.LinkedHashMap[K, X], ys: mutable.LinkedHashMap[K, Y])(f: (X, Y) => Z): mutable.LinkedHashMap[K, Z] =
  xs.flatMap {
    case (k, x) => ys.get(k).map(k -> f(x, _))
  }
它给了我这个:

val map1 = LinkedHashMap(4 -> (4), 7 -> (4,7))
val map2 = LinkedHashMap(3 -> (3), 6 -> (3,6), 7 -> (3,7))

val merged = mergeWith(map1,map2){ (x, y) => (x, y) }
merged: scala.collection.mutable.LinkedHashMap[Int,(Any, Any)] = Map(7 -> ((4,7),(3,7)))
但我想要的是:

merged: scala.collection.mutable.LinkedHashMap[Int,(Any, Any)] = Map(3 -> (3), 4 -> (4), 6 -> (3,6), 7 -> ((4,7),(3,7)))

如何修改我的代码以获得它?

无法使用当前的
mergeWith()
签名。特别是,您正在尝试创建一个
LinkedHashMap[K,Z]
,但是没有
Z
输入。获取
Z
的唯一方法是调用
f()
,它需要
X
Y
作为传递参数

因此,如果
xs
是type
LinkedHashMap[Int,Char]
并且有元素
(2->'w')
,而
ys
是type
LinkedHashMap[Int,Long]
并且有元素
(8->4L)
,那么您将如何调用
f(c:Char,l:Long)
,从而获得
[K,Z]
输入两个键
2
8
?不可能

如果
mergeWith()
签名可以简化,您可以这样做

def mergeWith[K,V](xs: collection.mutable.LinkedHashMap[K, V]
                  ,ys: collection.mutable.LinkedHashMap[K, V]
                  )(f: (V, V) => V): collection.mutable.LinkedHashMap[K,V] = {
  val ns = collection.mutable.LinkedHashMap[K,V]()
  (xs.keySet ++ ys.keySet).foreach{ k =>
    if (!xs.isDefinedAt(k)) ns.update(k, ys(k))
    else if (!ys.isDefinedAt(k)) ns.update(k, xs(k))
    else ns.update(k, f(xs(k), ys(k)))
  }
  ns
}
这将为您给出的示例生成所需的结果,但它有许多不需要的特性,其中最不重要的是可变数据结构

顺便说一句,没有Tuple1这样的东西,所以
(4)
4
是一样的东西。每当你看到type
Any
,这是一个很好的迹象,表明你的设计需要重新思考