2017-09-02 13 views
-1

我想要的目錄列表轉換爲字符串使用折deliminator左倍留給名單​​列表轉換成字符串

我想創建一個字符串,但它有額外的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

任何人都可以請解釋downvote的原因。任何改進 – coder25

+0

在我的電腦上這段代碼已經返回預期的結果 – mkUltra

+0

@mkUltra sry出錯我已經更新了這個問題。我的預期輸出是'2!2!ABC!20.0!' – coder25

回答

0

你不需要foldLeft爲了這。如果我正確猜測你想從你的「預期結果」中做什麼(這是一個很好的方法來問一個問題,順便說一句),這樣的事情應該可以工作(你似乎沒有在任何地方使用flag,所以我放棄了它):

trait Grp extends Msg { 
    def toCustString: String = list.map(_.toCustString).mkString("!") 
    } 

如果在年底額外的分離是不是筆誤,那麼,最好的方式把它塞進去上,只是做了明確:val m = MyMessage(Seq(TypeA(2),s)).toCustString + "!"

+0

我需要國旗的原因 – coder25

+0

我需要國旗的原因,我的分層取決於條件 – coder25

+0

這很好,你可以有國旗,如果你想。這只是在你的例子中,它沒有被使用,所以我省略了它。 – Dima

0

通常以列表項轉換爲字符串分隔符我用mkString:

List("", "B", "C").mkString(",") 

我們可以用這種方式做同樣的事情foldLeft:

List("", "B", "C").foldLeft(List[String]())((acc, item) => 
    if (acc.isEmpty) acc :+ item else acc :+ "," :+ item 
).mkString 
0

使用stringutils.join與流。