2016-09-26 1 views
1
Map(Mary -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))): 
    Map[String, List[(String, Int)]] 

Comment puis-je plier les cartes pour produire quelque chose commeScala tuples pliage

Map("Mary" -> List(("Mary", 7065+2604+1414))): 
    Map[String, List[(String, Int)]] 

?

+0

Je suppose '7065 + 2604 + 1414' est un 'String'? –

+0

J'ai fait quelques modifications sous l'hypothèse que c'était en fait la somme, excuses si je me trompe. –

+0

Non, il devrait être un int, juste n'a pas pris la peine de les ajouter afin qu'il soit facile à comprendre – kevinz315

Répondre

1

Pour votre cas particulier, vous pouvez utiliser ce

map.map { case (k, v) => k -> v.map(_._2).sum } 

mais généralement en dessous de code fonctionne pour tout, même si les touches sont différentes

Ne GroupBy avec le premier élément du tuple et collapse alors la liste qui est la valeur de la carte obtenue après groupby

val list = Map("Mary") 
list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum} 

Scala REPL

scala> val list = map("Mary") 
list: List[(String, Int)] = List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414)) 

scala> list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum} 
res11: Map[String, Int] = Map("Mary" -> 11083) 

scala> val map = Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))) 
map: Map[String, List[(String, Int)]] = Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))) 

scala> val list = map("Mary") 
list: List[(String, Int)] = List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414)) 

scala> list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum} 
res14: Map[String, Int] = Map("Mary" -> 11083) 
0

groupe Vous le est la clé, puis replier sur les valeurs:

scala> val input = Map("Mary" -> List(("Mary", 1), ("Mary", 2), ("Mary", 3))) 
res1: Iterable[scala.collection.immutable.Map[String,List[(String, Int)]]] = List(Map(Mary -> List((Mary,1), (Mary,2), (Mary,3)))) 

scala> input.values.map(_.groupBy(_._1).map { case (k, v) => (k -> v.map(_._2).foldLeft(0)(_ + _))}) 
res7: Iterable[scala.collection.immutable.Map[String,Int]] = List(Map(Mary -> 6)) 
0
val data = Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))) 

data map { case (x,y) => (x, y.foldLeft(0)((acc, elem) => acc + elem._2)) } 

Il en résulte la carte: scala.collection.immutable.Map[String,Int] = Map(Mary -> 11083)

+0

Cette réponse est correcte pour la "vieille" version de la question de la façon dont il a été demandé. – wheaties