Lo que es la forma correcta de eliminar los elementos de un mapa mutable Scala utilizando un predicado
-
21-09-2019 - |
Pregunta
Cómo hacer que sin crear nuevas colecciones? ¿Hay algo mejor que esto?
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. en Scala 2.8
Solución
retain
hace lo que quiere. En 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)
También funciona, pero creo que todavía está en proceso de cambio, en 2.8.
Otros consejos
Por la Scala mutable mapa página de referencia , puede eliminar un solo elemento, ya sea con - = o eliminar, de esta manera:
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)
La diferencia es que - (. Si había uno) = devuelve el objeto de mapa original, mientras que quitar devuelve una opción que contiene el valor correspondiente a la clave eliminado
Por supuesto, como otras respuestas indican, si desea eliminar muchos elementos en función de una condición, usted debe buscar en retener, filtro, etc.
Si está utilizando un immutable.Map
, en 2.7 podría tener que ser algo como:
def pred(k: Int, v: String) = k % 2 == 0
m --= (m.filter(pred(_, _)).keys
Como no existe un método retain
disponible. Obviamente, en este caso m
debe ser declarado como un var