92 votes

Mappez à la fois les clés et les valeurs d'une carte Scala

Le MapLike Scala a une méthode

 mapValues [C] (f: (B)  C): Map[A, C] 

Mais je veux parfois un type différent :

 mapKeysAndValues [C] (f: (A, B)  C): Map[A, C] 

Existe-t-il un moyen simple de le faire qui me manque? Bien sûr, cela peut être fait avec un pli.

170voto

tenshi Points 13370

map itère à travers toutes les paires (key, value) Vous pouvez l'utiliser comme ceci :

 val m = Map("a" -> 1, "b" -> 2)

val incM = m map {case (key, value) => (key, value + 1)}

9voto

Tomasz Nurkiewicz Points 140462

Et ce code :

 val m = Map(1 -> "one", 2 -> "two")
def f(k: Int, v: String) = k + "-" + v
m map {case (k, v) => (k, f(k, v))}

Ce qui produit :

  Map(1 -> 1-one, 2 -> 2-two)

Cela peut être empaqueté dans la méthode utilitaire :

 def mapKeysAndValues[A,B,C](input: Map[A,B], fun: (A, B) => C) = 
  input map {case(k,v) => (k, fun(k, v))}

Usage:

 mapKeysAndValues(
  Map(1 -> "one", 2 -> "two"), 
  (k: Int, v: String) => k + "-" + v
)

5voto

GKislin Points 254
m map (t => (t._1, t._2 + 1))

m map (t => t._1 -> t._2 + 1)

2voto

missingfaktor Points 44003

Avec quelques Scalaz :

 scala> def fst[A, B] = (x: (A, B)) => x._1
fst: [A, B]=> (A, B) => A

scala> Map(1 -> "Lorem", 2 -> "Ipsum").map(fst &&& Function.tupled(_.toString + _))
res1: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> 1Lorem, 2 -> 2Ipsum)

J'aime mieux la solution de @tenshi.

0voto

axaluss Points 975

Vous pouvez créer une classe utilitaire :

 class MyMapLike[K,V](m:MapLike[K,V,_]){
 def mapKeysAndValues[R](f: (K, V) => R)={
   m.map{case (k,v)=> f(k,v)}
 } 
}
object MyMapLike{
 implicit def maplike2mymaplike[K,V](ml:MapLike[K,V,_]):MyMapLike[K,V]=new MyMapLike(m)

}

import MyMapLike._
Map(1 -> "one", 2 -> "two").mapKeysAndValues(k,v=>v*k)

Code non testé mais cela devrait fonctionner d'une manière similaire comme ça.

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