2017-08-23 85 views
-2

我有一個嵌套的列表結構,我想通過列表進行迭代並打印它的自定義字符串版本遍歷目錄的列表,並收集元素爲字符串

trait Value{ 
      def myString:String 
     } 

    case class Student(value: String) extends Value{ 
    override def myString: String = s"Student =$value" 
    } 
    case class Employee(value: Double) extends Value{ 
    override def myString: String = s"Employee =$value" 
    } 
    case class Department(value: Int) extends Value{ 
    override def myString: String = s"Dept =$value" 
    } 

    case class Grp (elements: List[Value] = Nil) extends Value { 
    def add (value: Value): Grp = Grp(this.elements ++ List(value)) 
    override def myString: String = "" 
    } 

    val group= Grp() 
    .add(Student("abc")) 
    .add(Employee(100.20)) 
    .add(Department(10)) 
    .add(Grp().add(Student("xyz"))) // nested group`e 
    .add(Grp().add(Employee("def"))) 

我想有字符串表示所述group。如何通過group迭代調用myString方法

更新

輸出

Student = abc 
Employee = 100.20 
Department =10 
Student =xyz 
Employee= def 

回答

0

試試這個

group.elements.map(_.value.myString).mkString("\n") 

注意

Grp類是Value繼承,所以上述方案實際上應該是myString的價值你01組班。然後,要獲得Grp的字符串表示形式,只需致電即可。


爲了澄清,

case class Grp (elements: List[Value] = Nil) extends Value { 
    def add (value: Value): Grp = Grp(this.elements ++ List(value)) 
    override def myString: String = elements match { 
     case e::rest => elements.map(_.myString).mkString("\n") 
     case _ => "" 
    } 
} 

現在只是做groups.myString得到串

+0

它不打印嵌套組值'學生( 「XYZ」)' – coder25

+0

SRY是我不好,我需要更新我的問題。實際使用案例有點不同 – coder25

+0

正如我在說明中所說的,您需要重寫併爲'Grp'類中的'myString'指定一個值。這樣,轉換將遞歸地將所有嵌套的'Grps'轉換爲字符串 – smac89