如何修改包含集合的Map的值,返回一个新的Map? [英] How to modify a value of a Map which contains Sets, returning a new Map?

查看:106
本文介绍了如何修改包含集合的Map的值,返回一个新的Map?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个 Map [Int,Set [Int]] ,如何修改Map的单个值,并在过程中生成一个新值,例如:

  val x = Map(1  - > Set(1,2,3))
x(1)+ 5 //这将创建一个新的Set,但不会创建一个新的Map

val y = x(1)change {x => x + 5}
//以前的功能是我正在寻找
// z:Set [Int]] = List(Set(1,2,3,5))


解决方案

在scala 2.10中:

 隐式类ChangeableMap [K,V](val m:Map [K,V])扩展AnyVal {
def change(k:K) V => V):Map [K,V] = {
m.get(k).map {v => m +(k-> transform(v))} .getOrElse(m)
}
}

一些测试:

  scala> val x = Map(1  - > Set(1,2 ,3),2  - > Set(4,5))
x:scala.collection.immutable.Map [Int,scala.collection.immutable.Set [Int]] = Map(1 - > Set 1,2,3),2 - > Set(4,5))
scala> x.change(1){x => x + 5}
res1:Map [Int,scala.collection.immutable.Set [Int]] = Map(1 - > Set(1,2,3,5),2 - > Set(4 ,5))

如果您使用的是scala 2.9,那么这样做:

  class ChangeableMap [K,V](m:Map [K,V]){
def change(k:K) :V => V):Map [K,V] = {
m.get(k).map {v => m +(k-> transform(v))} .getOrElse(m)
}
}
隐式def toChangeableMap [K,V](m:Map [K,V]) = new ChangeableMap [K,V](m)


Given a Map[Int, Set[Int]], how can I modify a single value of the Map, generating a new one in the process, for example:

val x = Map(1 -> Set(1,2,3))
x(1) + 5 // This creates a new Set, but not a new Map

val y = x(1) change { x => x + 5 }
// The previous functionality is what I'm looking for
// z: Set[Int]] = List(Set(1, 2, 3, 5))

解决方案

In scala 2.10:

implicit class ChangeableMap[K,V]( val m: Map[K,V] ) extends AnyVal {
  def change( k: K )( transform: V => V ): Map[K,V] = {
    m.get( k ).map{ v => m + (k-> transform(v)) }.getOrElse( m )
  }
}

Some test:

scala>val x = Map(1 -> Set(1,2,3), 2 -> Set(4,5))
x: scala.collection.immutable.Map[Int,scala.collection.immutable.Set[Int]] = Map(1 -> Set(1, 2, 3), 2 -> Set(4, 5))
scala> x.change(1) { x => x + 5 }
res1: Map[Int,scala.collection.immutable.Set[Int]] = Map(1 -> Set(1, 2, 3, 5), 2 -> Set(4, 5))

If you're in scala 2.9, this will do:

class ChangeableMap[K,V]( m: Map[K,V] ) {
  def change( k: K )( transform: V => V ): Map[K,V] = {
    m.get( k ).map{ v => m + (k-> transform(v)) }.getOrElse( m )
  }
}
implicit def toChangeableMap[K,V]( m: Map[K,V] ) = new ChangeableMap[K,V]( m )

这篇关于如何修改包含集合的Map的值,返回一个新的Map?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆