说我有这样的地图:
scala> val a = Map("a"->2, "d" -> 4, "r" -> 5)
a: scala.collection.immutable.Map[String,Int] = Map(a -> 2, d -> 4, r -> 5)
我想从中动态删除多个密钥。虽然我能够做到这一点:
scala> a - ("a","r")
res13: scala.collection.immutable.Map[String,Int] = Map(d -> 4)
但是以下失败了:
scala> val keys = ("d","r")
as: (String, String) = (d,r)
scala> a - keys
<console>:15: error: type mismatch;
found : (String, String)
required: String
a - keys
^
虽然我知道这会是一些投射问题,但我无法想出这个简单的事情。
我也尝试将keys
作为数组,如前面的例子中它变成了一个元组,但也失败了。
scala> val keys = Array("d","r")
as: Array[String] = Array(d, r)
scala> a - keys
<console>:15: error: type mismatch;
found : Array[String]
required: String
a - keys
^
答案 0 :(得分:5)
要从Map
删除多个密钥,请使用--
method:
a -- Set("a", "r")
以下说明了类型不匹配错误。
您正在调用的Map
上的-
method版本有三个参数:(1)要删除的第一个元素的键,(2)要删除的第二个元素的键,和(3)表示要移除的零个或多个剩余元素的varargs。 (另一个版本的-
只使用一个键作为参数。)
a - ("a", "r")
上面的代码没有将元组传递给-
方法;它将两个String
参数传递给-
方法。换句话说,上述内容相当于:
a.-("a", "r")
但是,下面的代码......
val keys = ("d", "r")
a - keys
... 尝试将元组作为参数传递给-
方法。它相当于:
a.-(("d", "r"))
当您尝试将元组传递给-
方法时,会出现类型不匹配错误,因为-
方法需要一个或多个String
。
答案 1 :(得分:2)
这很简洁。
scala> a - "a" - "r"
res0: scala.collection.immutable.Map[String,Int] = Map(d -> 4)
如果您想在删除之前撰写密钥列表。
val ks = Seq("d","r")
ks.foldLeft(a)(_ - _) //res2: collection.immutable.Map[String,Int] = Map(a -> 2)
答案 2 :(得分:0)
-
运算符根据Map
API一次处理一个键。如果您尝试使用Array
个键,则可以尝试foldLeft
:
val keys = Array("d","r")
scala> keys: Array[String] = Array(d, r)
keys.foldLeft(a)((map, keyToRemove) => map - keyToRemove)
scala> res0: scala.collection.immutable.Map[String,Int] = Map(a -> 2)
答案 3 :(得分:0)
从$value = (isset($_POST['value']) ? $_POST['value'] : 'alternative';
开始,removedAll
方法提供了不变的Scala 2.13
,作为--
的别名:
Map
def removeAll(keys:IterableOnce [K]):Map [K,V]