47 votes

Comment implémenter Map avec l'opération par défaut dans Scala

class DefaultListMap[A, B <: List[B]] extends HashMap[A, B] {
    override def default(key: A) = List[B]() 
  }

Je ne veux pas créer la carte A -> List[B] . Dans mon cas, c'est Long -> List[String] mais lorsque j'obtiens une clé de la carte qui n'a pas de valeur, j'aimerais créer un List vide au lieu de lancer Exception J'ai essayé différentes combinaisons mais je ne sais pas comment faire passer le code ci-dessus au compilateur.

Merci d'avance.

116voto

Ilya Klyuchnikov Points 936

Pourquoi ne pas utiliser withDefaultValue(value) ?

 scala> val m = Map[Int, List[String]]().withDefaultValue(List())
m: scala.collection.immutable.Map[Int,List[String]] = Map()

scala> m(123)
res1: List[String] = List()

11voto

kassens Points 2874

Il existe une méthode withDefaultValue sur Map :

 scala> val myMap = Map(1 -> List(10), 2 -> List(20, 200)).withDefaultValue(Nil)
myMap: scala.collection.immutable.Map[Int,List[Int]] = Map((1,List(10)), (2,List(20, 200)))

scala> myMap(2)
res0: List[Int] = List(20, 200)

scala> myMap(3)
res1: List[Int] = List()

4voto

Landei Points 30509

Pourquoi vouloir manipuler une carte alors qu'elle a déjà une méthode pour cela ?

 val m = Map(1L->List("a","b"), 3L->List("x","y","z"))  
println(m.getOrElse(1L, List("c"))) //--> List(a, b)
println(m.getOrElse(2L, List("y"))) //--> List(y)

2voto

tharindu_DG Points 301

withDefault peut également être utilisé.

 /** The same map with a given default function.
 *  Note: `get`, `contains`, `iterator`, `keys`, etc are not affected
 *  by `withDefault`.
 *
 *  Invoking transformer methods (e.g. `map`) will not preserve the default value.
 *
 *  @param d     the function mapping keys to values, used for non-present keys
 *  @return      a wrapper of the map with a default value
 */
 def withDefault[B1 >: B](d: A => B1): immutable.Map[A, B1]

Exemple:

 scala> def intToString(i: Int) = s"Integer $i"
intToString: (i: Int)String

scala> val x = Map[Int, String]().withDefault(intToString)
x: scala.collection.immutable.Map[Int,String] = Map()

scala> x(1)
res5: String = Integer 1

scala> x(2)
res6: String = Integer 2

J'espère que cela t'aides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X