11
votes

Scala Construire une chaîne de itération sur la carte

Si j'ai une carte et que je souhaite construire une chaîne de itération de celui-ci, est-il un moyen d'avoir la chaîne finale résultant d'une expression au lieu de définir une variable et de modifier cela à l'intérieur d'une boucle?

au lieu de ce xxx

je préférerais que ce soit xxx


0 commentaires

5 Réponses :


7
votes

Vous pouvez le faire avec un pli:

scala> myMap.foldLeft("") { (s: String, pair: (String, String)) =>
     |   s + pair._1 + pair._2
     | }
res0: java.lang.String = 1234


2 commentaires

Potentiellement beaucoup de concaténation de chaînes coûteuses là-bas si la carte atteint une grande taille.


C'est vrai. Si la concaténation est tout ce que vous êtes après, utilisez mkstring comme dans la réponse de Daniel ou de Kevin.



2
votes

Je suis assez nouveau à Scala, mais vous pouvez essayer réduceleft code>. Il accumule une valeur partielle (la chaîne étant jointe à chaque élément). Par exemple, si vous voulez les touches (ou les valeurs) jointes dans une chaîne, faites simplement:

val s = myMap.keys.reduceLeft( (e, s) =>  e + s)


1 commentaires

@Kevin, haha, oui, tu as raison. J'ai dit que j'étais assez nouveau à Scala :)



18
votes

Je voudrais juste mappe et mkstring . Par exemple: xxx


0 commentaires

13
votes

Quant à la réponse de Daniel, mais avec quelques optimisations et mes propres préférences de formatage:

val myMap = Map("1" -> "2", "3"->"4")
val s = myMap.view map {
  case (key, value) => "Key: " + key + "\nValue: " + value
} mkString ("", "\n", "\n")


0 commentaires

2
votes

Cela fonctionne également bien si vous ne vous inquiétez pas de votre propre formatage:

scala> Map("1" -> "2", "3"->"4").mkString(", ")
res6: String = 1 -> 2, 3 -> 4


0 commentaires