2010-03-23 11 views
14

Come fare senza creare nuove collezioni? C'è qualcosa di meglio di questo?Qual è il modo corretto per rimuovere elementi da una mappa scala mutabile usando un predicato

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

+4

Le domande relative alle raccolte devono indicare se viene richiesta una risposta 2.7 o 2.8. –

+0

Usando 2.8 per un tempo abbastanza lungo, ho già dimenticato 2.7. Grazie, ha aggiunto P.S. –

+2

C'è un tag Scala-2.8 che potresti aggiungere come indicazione che si tratta di una domanda specifica 2.8. – ams

risposta

18

retain fa quello che vuoi. 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) 

Funziona anche, ma penso che sia ancora in flusso, in 2.8.

+1

Sembra che retain sia deprecato in 2.8: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/Map .html deprecato: non può essere desunto dal tipo di conservazione in Iterable. –

+0

Infatti; potrebbe doverlo rinominare o escogitare qualche altra soluzione. Non penso che svanirà; sarebbe una specie di sciocco. Sto interpretando quella deprecazione come "in flusso, potrebbe cambiare". –

+0

Sembra che la rimozione verrà rimossa. Quindi la risposta è corretta. –

0

Se si utilizza un immutable.Map, in 2.7 potrebbe essere qualcosa di simile:

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

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

Poiché non esiste un metodo disponibile retain. Ovviamente in questo caso m deve essere dichiarato come un var

+0

Se stai usando una mappa immutabile e quindi devi crearne una nuova, è piuttosto semplice filtrare semplicemente con la negazione del predicato. –

+0

In effetti, questo è vero: dipende da quello che senti è più leggibile in una determinata situazione –

2

Per la mappa mutevole Scala reference page, è possibile rimuovere un singolo elemento sia con - = o rimuovere, in questo modo:

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 differenza è che - = restituisce l'oggetto mappa originale, mentre remove restituisce un'opzione contenente il valore corrispondente alla chiave rimossa (se ce n'era una).

Ovviamente, come indicano altre risposte, se si desidera rimuovere molti elementi in base a una condizione , dovresti cercare tra conservare, filtrare, ecc.

Problemi correlati