【发布时间】:2011-09-21 22:09:44
【问题描述】:
我正在编写一个函数来将两个 Map 合并在一起。这是我目前所拥有的:
def merge[K, V1, V2, V3](left: Map[K, V1], right: Map[K, V2])
(fn: (Option[V1], Option[V2]) => V3): Map[K, V3] = {
val r = (left.keySet ++ right.keySet) map {
key =>
(key -> fn(left.get(key), right.get(key)))
}
r.toMap
}
函数本身有效。你这样使用函数:
val m1 = Map(1 -> "one", 3 -> "three", 5 -> "five")
val m2 = Map(1 -> "I", 5 -> "V", 10 -> "X")
merge(m1, m2) { (_, _) }
// returns:
// Map(1 -> (Some(one),Some(I)),
// 3 -> (Some(three),None),
// 5 -> (Some(five),Some(V)),
// 10 -> (None,Some(X)))
我有两个问题:
- 我担心
.get和.toMap调用的性能计算复杂度。任何人都可以改进实施吗? - 我希望默认函数生成一对值 (
{ (_, _) })。我无法完全掌握正确执行此操作的语法。
编辑:
虽然我最初说的是性能,但我指的是计算复杂度。 我的猜测是这个函数在 O(n•ln(n)) 时间内执行。 看起来我的函数大致在 O(n) 时间内执行。可以在 O(ln(n)) 内完成吗?
【问题讨论】:
-
回答问题 1:您可能会看看 Scalaz 的映射类幺半群,如 Eric Torreborre 的 illustrated。你的问题有点不同,但它可能会给你一些想法。
-
请看上面的例子。
-
@Kipton 地图幺半群令人印象深刻。我得考虑一下,看看这是否适用。
标签: scala