如何动态地从Map中删除多个键

时间:2017-08-17 17:23:53

标签: scala

说我有这样的地图:

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
           ^

4 个答案:

答案 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]