3
votes

Comment accéder aux tuples d'une liste dans une carte dans Scala?

J'ai une carte au format

map.keys.foreach{i =>
    println(i)
    println(map(i))    

et je veux pouvoir accéder aux différents Int. Le format des données à intégrer dans la carte sera toujours

Mon-18-June-2018
List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25))

Où la date est la clé de la carte et chaque ensemble de trois nombres est le (Int, Int, Int)

Jusqu'à présent, j'ai pu imprimer la carte dans ce format

Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25

En utilisant le code ci-dessous

scala.collection.mutable.Map[String,List[(Int, Int, Int)]]

Je voudrais pouvoir accéder aux valeurs individuelles dans les tuples. Par exemple, je voudrais pouvoir ajouter toutes les deuxième et troisième valeurs de chaque tuple ensemble
(1,10,5)
(2,20,10)
(3,30,15)
(4,40,20)
(5,50,25)

pour obtenir
(6,150,75)

Comment puis-je faire cela?


2 commentaires

Comment l'ajout de la deuxième et de la troisième valeur donne-t-il (6,150,75)? D'où vient le 6?


Copie possible de Scala: comment additionner une liste de tuples


3 Réponses :


4
votes

Vous pouvez utiliser la correspondance de modèle pour accéder aux éléments du tuple.

val dateMap :Map[String,List[(Int, Int, Int)]] =
  Map("Mon-18-June-2018" ->
    List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))

dateMap.values.map(_.fold((1,0,0)){case ((a,b,c),(x,y,z)) => (a+1,b+y,c+z)})
//res0: Iterable[(Int, Int, Int)] = List((6,150,75))


0 commentaires

1
votes

Pour obtenir chaque valeur individuelle dans une liste, vous pouvez .map à l'intérieur.

Pour obtenir chaque élément d'un tuple, utilisez tuple._1 , tuple._2 , tuple._3 , etc.

Dans votre cas, pour ajouter toutes les valeurs des tuples ensemble, vous pouvez faire quelque chose comme ceci:

m.map{
  // get keys and values
  case (k, v) =>
    // "x -> y" creates a Tuple, or in this case a Map
    k -> (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
}
// Map(Mon-18-June-2018 -> (15,150,75))

Cela créera une liste de tuples ( (Int, Int, Int) ), où chaque Tuple correspond à une clé dans la carte originale. Vous pouvez même conserver les clés de la carte d'origine en faisant quelque chose comme ceci:

val m = scala.collection.mutable.Map[String,List[(Int, Int, Int)]](
  "Mon-18-June-2018" -> List((1, 10, 5), (2, 20, 10), (3, 30, 15), (4, 40, 20), (5, 50, 25))
)

m.map {
  // get keys and values
  case (k, v) =>
    // construct a Tuple of all of the sums
    (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
}
// ArrayBuffer((15,150,75))


2 commentaires

Cela ne donne pas le résultat escompté (6,150,75).


Comme je l'ai commenté sur la question, il n'a jamais été expliqué comment OP avait obtenu 6 pour la première valeur Tuple en premier lieu. J'ai supposé que c'était une faute de frappe. Comment pensez-vous qu'ils s'attendaient à obtenir 6?



2
votes

Le moyen le plus simple est:

val yourMap : Map[String,List[(Int, Int, Int)]] = Map("Mon-18-June-2018" -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))
yourMap.map(x=> (x._2.length+1,x._2.map(_._2).sum,x._2.map(_._3).sum))

vous pouvez trouver plus de formulaires ici: Scala: Comment additionner une liste de tuples


0 commentaires