我希望使用fold left
将列表列表转换为带有分隔符的字符串我正在尝试创建一个String,但它有额外的deliminator
trait Msg {
def toCustString(flag:Boolean): String
}
trait Ele[T] extends Msg {
val value: T
override def toCustString(flag:Boolean): String = s"${value}"
}
trait Grp extends Msg {
val list: Seq[Msg]
override def toCustString(flag: Boolean = false): String = {
val sep = if (flag) "\n" else "!"
test((builder: StringBuilder, elem: Msg) => builder.append(s"$sep${elem.toCustString(false)}$sep"))
}
def test(acc: (StringBuilder, Msg) => StringBuilder): String = {
list.foldLeft(StringBuilder.newBuilder)(acc).toString()
}
}
case class MyMessage(list:Seq[Msg]) extends Grp
case class TypeA(value: Int) extends Ele[Int]
case class TypeB(value: String) extends Ele[String]
case class TypeC(value: Float) extends Ele[Float]
case class MyGrp (list:Seq[Msg]) extends Grp
object Demo extends App{
val grp1 = MyGrp(Seq(TypeA(2)))
val grp2 = MyGrp(Seq(TypeB("ABC"), TypeC(20)))
val s=MyGrp(Seq(grp1,grp2))
val m = MyMessage(Seq(TypeA(2),s)).toCustString(false)
print(m)
}
更新
我的输出是!2 !!!! 2 !!!! ABC !! 20.0 !!!
预计 2!2!ABC!20.0!
答案 0 :(得分:0)
通常将列表项转换为带分隔符的字符串我使用mkString:
List("", "B", "C").mkString(",")
我们可以用这种方式用foldLeft做同样的事情:
List("", "B", "C").foldLeft(List[String]())((acc, item) =>
if (acc.isEmpty) acc :+ item else acc :+ "," :+ item
).mkString
答案 1 :(得分:0)
您不需要foldLeft
。如果我正确地猜测你正在尝试从你的预期结果" (这是一个提出问题的可怕方式,顺便说一下),这样的事情应该有效(你似乎没有在任何地方使用flag
,所以我放弃了它):
trait Grp extends Msg {
def toCustString: String = list.map(_.toCustString).mkString("!")
}
如果最后的额外分隔符不是拼写错误,那么最好的方法就是明确地说明:val m = MyMessage(Seq(TypeA(2),s)).toCustString + "!"
答案 2 :(得分:0)
将stringutils.join与流一起使用。