向左折叠以将List列表转换为字符串

时间:2017-09-02 16:43:26

标签: scala

我希望使用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!

3 个答案:

答案 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与流一起使用。