web-dev-qa-db-fra.com

Scala groupPar une liste

J'aimerais créer une carte sur laquelle la clé est la chaîne et la valeur est le nombre de fois où la chaîne apparaît dans la liste. J'ai essayé la méthode groupBy, mais je n'ai pas réussi à le faire.

4
T.Simmari

Réponse requise

scala> val l = List("abc","abc","cbe","cab")
l: List[String] = List(abc, abc, cbe, cab)

scala> l.groupBy(identity).mapValues(_.size) 
res91: scala.collection.immutable.Map[String,Int] = Map(cab -> 1, abc -> 2, cbe -> 1)
7

Supposons que vous ayez une liste comme

scala> val list = List("abc", "abc", "bc", "b", "abc")
list: List[String] = List(abc, abc, bc, b, abc)

Vous pouvez écrire un fonction

scala> def generateMap(list: List[String], map:Map[String, Int]) : Map[String, Int] = list match {
     |       case x :: y => if(map.keySet.contains(x)) generateMap(y, map ++ Map(x -> (map(x)+1))) else generateMap(y, map ++ Map(x -> 1))
     |       case Nil => map
     |     }
generateMap: (list: List[String], map: Map[String,Int])Map[String,Int]

Puis appelez le fonction comme

scala> generateMap(list, Map.empty)
res1: Map[String,Int] = Map(abc -> 3, bc -> 1, b -> 1)
0
Ramesh Maharjan