折叠处理角落案例的功能方法

时间:2014-05-12 20:56:26

标签: scala functional-programming fold

我想要转换成以下内容的节点列表(String)。

create X ({name:"A"}),({name:"B"}),({name:"B"}),({name:"C"}),({name:"D"}),({name:"F"})

使用折叠我可以额外获得所有内容","在末尾。我可以使用最终String上的子字符串删除它。我想知道在Scala中是否有更好/更实用的方法吗?

  val nodes = List("A", "B", "B", "C", "D", "F")

  val str = nodes.map( x => "({name:\"" + x + "\"}),").foldLeft("create X ")( (acc, curr) => acc + curr )
  println(str)

 //create X ({name:"A"}),({name:"B"}),({name:"B"}),({name:"C"}),({name:"D"}),({name:"F"}),

3 个答案:

答案 0 :(得分:6)

解决方案1 ​​

您可以使用mkString功能,该功能不会在最后添加分隔符。

在这种情况下,您首先将每个元素映射到相应的String,然后使用mkString来放置','其间。

由于"create X"在开始时是静态的,您可以将其添加到结果中。

val str = "create X " + nodes.map("({name:\"" + _ + "\"})").mkString(",")

解决方案2

另一种看待这种情况的方法:因为你只追加了一个','太多了,你可以把它删掉。

val str = nodes.foldLeft("create X ")((acc, x) => acc + "({name:\"" + x + "\"}),").init

init只接受集合中的所有元素,除了最后一个。 (字符串在这里被视为字符集合)

因此,如果您nodes中有元素,则会删除','。如果没有,您只能获得"create X ",因此删除了空白区域,无论如何都不需要。

nodes为空时,解决方案1和2不等效。解决方案1将保留空白区域。

答案 1 :(得分:1)

移动","从地图(适用于所有)折叠/缩小

val str ="创建X" + nodes.map(x =>"({name:\"" + x +" \"})")。reduceLeftOption(_ + "," + _)。getOrElse("")

答案 2 :(得分:1)

加入一堆东西,在每件东西之间拼接一些东西,不是一个地图形状的问题。因此,在地图调用中添加逗号并不真正“适合”。

我通常通过在 fold 期间在每个项目之前插入逗号来做这类事情;折叠可以测试累加器是否为“空”而不是插入逗号。

对于这种特殊情况(字符串连接),它已经很常见了,它已经有了一个库函数:mkString