开发者

What is the proper way to remove elements from a scala mutable map using a predicate

开发者 https://www.devze.com 2022-12-23 17:03 出处:网络
How to do that without creating any new collections? Is there something bette开发者_运维技巧r than this?

How to do that without creating any new collections? Is there something bette开发者_运维技巧r than this?

val m = scala.collection.mutable.Map[String, Long]("1" -> 1, "2" -> 2, "3" -> 3, "4" -> 4)
m.foreach(t => if (t._2 % 2 == 0) m.remove(t._1))
println(m)

P.S. in Scala 2.8


retain does what you want. In 2.7:

val a = collection.mutable.Map(1->"one",2->"two",3->"three")
a: scala.collection.mutable.Map[Int,java.lang.String] = 
  Map(2 -> two, 1 -> one, 3 -> three)

scala> a.retain((k,v) => v.length < 4)   

scala> a
res0: scala.collection.mutable.Map[Int,java.lang.String] =
  Map(2 -> two, 1 -> one)

It also works, but I think is still in flux, in 2.8.


Per the Scala mutable map reference page, you can remove a single element with either -= or remove, like so:

val m = scala.collection.mutable.Map[String, Long]("1" -> 1, "2" -> 2, "3" -> 3, "4" -> 4)
m -= "1" // returns m
m.remove("2") // returns Some(2)

The difference is that -= returns the original map object, while remove returns an Option containing the value corresponding to the removed key (if there was one.)

Of course, as other answers indicate, if you want to remove many elements based on a condition, you should look into retain, filter, etc.


If you are using an immutable.Map, in 2.7 it might have to be something like:

def pred(k: Int, v: String) = k % 2 == 0

m --= (m.filter(pred(_, _)).keys

As there is no retain method available. Obviously in this case m must be declared as a var


for scala version=2.13.6 use filterInPlace

doc link

@ val a = collection.mutable.Map(1->"one",2->"two",3->"three")
a: collection.mutable.Map[Int, String] = HashMap(
  1 -> "one",
  2 -> "two",
  3 -> "three"
)

@ a.filterInPlace((k,v) => v.length < 4)
res1: collection.mutable.Map[Int, String] = HashMap(1 -> "one", 2 -> "two")

@ a
res2: collection.mutable.Map[Int, String] = HashMap(1 -> "one", 2 -> "two")
0

精彩评论

暂无评论...
验证码 换一张
取 消