加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 地图合并功能的改进

发布时间:2020-12-16 10:02:00 所属栏目:安全 来源:网络整理
导读:我正在编写一个函数将两个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),ri
我正在编写一个函数将两个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))中完成吗?

解决方法

对于默认函数文字使用:

(fn: (Option[V1],Option[V2]) => V3 = 
  (x: Option[V1],y: Option[V2]) => Tuple2(x,y))

你必须使用这样的合并:merge(m1,m2)()

我想说,在对实际数据进行一些测量之前,不要担心性能.

编辑:关于性能,通过提供视图而不是构建地图,您可以以查找为代价快速“构建” – 假设我们正在处理不可变映射.因此,根据实际数据和用例,您可以为某些操作获得更好的性能,但它需要权衡.

class MergedView[K,V3](
    left: Map[K,V2]
  )(fn: (Option[V1],Option[V2]) => V3 = (x: Option[V1],y)
  ) extends collection.DefaultMap[K,V3] {
  def get(key: K): Option[V3] = (left.get(key),right.get(key)) match {
    case (None,None) => None
    case t => Some(fn(t._1,t._2))
  }
  lazy val tuples = (left.keys ++ right.keys).map(key => key -> get(key).get)
  def iterator: Iterator[(K,V3)] = tuples.iterator
} 

val r1 = new MergedView(m1,m2)() // use parens here for second param list.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读