2017-09-02 4 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!通常、私はmkStringを使用区切りの文字列にリスト項目を変換する

+0

私のコンピュータ上の – coder25

+0

私のコンピュータにこのコードはすでに返されているのですか? – mkUltra

+0

@mkUltraは間違いのために試しました。私の予想される出力は '2!2!ABC!20.0!'です。 – coder25

答えて

0

あなたはfoldLeftを必要としませんこのため。あなたが「期待した結果」から何をしようとしているのかを正確に推測している場合(これは質問をするのはひどい方法です、btw)、このようなものが役に立つはずです(あなたはどこでもflag、それ):最後に余分なセパレータは、それから、IS、単に明示的にそれを行う上で、それを挟むための最良の方法タイプミスではなかった場合は

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

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 。