我想要转换成以下内容的节点列表(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"}),
答案 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
。