Lo que es la forma correcta de eliminar los elementos de un mapa mutable Scala utilizando un predicado

StackOverflow https://stackoverflow.com/questions/2500548

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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top