2017-09-03 21 views
0

元素的單一列表我要壓平嵌套列表結構壓平列表的列表中階

MyGrp(List(MyGrp(List(TypeA(2))), MyGrp(List(TypeB(ABC), TypeC(20.0))))) 

List(Type(A),TypeB(ABC),TypeC(20.0))

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)) 
} 

我已經嘗試使用

  1. s.list.flatten但它說'錯誤:(51,10)沒有隱式視圖 avai來自Msg => scala.collection.GenTraversableOnce [B]。
    s.list.flatten」

  2. s.list.map(x=>x.toCustString())但是這給一個字符串形式,我想作一個列表

回答

0

您可以用flatMap模式匹配,包裝非Grp s轉換爲單 - 元素列表:

val g = MyGrp(List(MyGrp(List(TypeA(2))), MyGrp(List(TypeB("ABC"), TypeC(20.0f))))) 

val out = g.list.flatMap { 
    case grp: Grp => grp.list 
    case msg => List(msg) 
} 
+0

THKS我有一個列表。現在我想將它們轉換爲一個清單,如'一個分隔符號「|」' – coder25

+0

築巢的更深層次不起作用:'MyGrp(SEQ( MyGrp( SEQ(MyGrp(SEQ(類型A(0)))))))' – jwvh