scala通过遍历地图构建字符串

时间:2011-05-12 22:31:32

标签: scala

如果我有一个地图并希望通过迭代来构建一个字符串,有没有办法让最终字符串成为表达式的结果,而不是定义一个变量并在循环中修改它?

而不是

val myMap = Map("1" -> "2", "3"->"4") 
var s = ""
myMap foreach s += ...

我宁愿它

var s = myMap something ...

5 个答案:

答案 0 :(得分:17)

我只是mapmkString。例如:

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

答案 1 :(得分:13)

至于丹尼尔的回答,但有一些优化和我自己的格式偏好:

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

优化:

  1. 首先创建地图的view,我避免创建中间集合
  2. 在分析时,直接字符串连接比String.format
  3. 更快

答案 2 :(得分:7)

你可以用折叠来做到这一点:

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

答案 3 :(得分:2)

我对Scala很新,但你可以试试reduceLeft。它会累积一个部分值(与每个元素连接的字符串)。例如,如果您希望在字符串中加入键(或值),请执行以下操作:

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

这导致“13

答案 4 :(得分:2)

如果您不打扰自己的格式,这也可以。

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