Каков правильный способ удаления элементов из изменяемой карты scala с использованием предиката
Как это сделать без создания каких-либо новых коллекций? Есть что-то лучше этого?
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. в Scala 2.8
Ответы
Ответ 1
retain
делает то, что вы хотите. В версии 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)
Он также работает, но я думаю, что все еще в движении, в 2.8.
Ответ 2
На Scala изменяемой карте справочной странице вы можете удалить один элемент с помощью - = или удалить, например:
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)
Разница заключается в том, что - = возвращает исходный объект карты, а remove возвращает параметр, содержащий значение, соответствующее удаляемому ключу (если таковой был.)
Конечно, как показывают другие ответы, если вы хотите удалить многие элементы на основе условия, вы должны посмотреть на сохранение, фильтр и т.д.
Ответ 3
Если вы используете immutable.Map
, в 2.7, возможно, должно быть что-то вроде:
def pred(k: Int, v: String) = k % 2 == 0
m --= (m.filter(pred(_, _)).keys
Поскольку не существует метода retain
. Очевидно, что в этом случае m
должен быть объявлен как var