coder25
coder25

Reputation: 2393

Represnt List of list to string with a deliminator

I want to write my custom toString to convert a list of lists to a string with delimiter |

trait Msg {   
  def toCustString(): String
}

trait Ele[T] extends Msg {   
    val value: T    
    override def toCustString(): String = s"${value}"        
}

trait Grp extends Msg {    
  val list: Seq[Msg]
  override def toCustString(): String = ""
}


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))
  print(s)
}

Final output should be 2|ABC|20|.Please notice the deliminator at end

Can anyone suggest a solution how to work on the above nested structure?

I have tried the below

  override def toCustString(): String = list.map(_.toCustString()).toString

Upvotes: 0

Views: 49

Answers (1)

jwvh
jwvh

Reputation: 51271

You just have to turn everything in the list to its CustString representation before calling mkString() on it.

trait Msg {
  def toCustString: String
}

trait Ele[T] extends Msg {
  val value: T
  override def toCustString: String = value + "|"
}

trait Grp extends Msg {
  val list: Seq[Msg]
  override def toCustString: String =
    list.map(_.toCustString).mkString
}

Tested as follows.

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

val grp1 = MyGrp(Seq(TypeA(2)))
val grp2 = MyGrp(Seq(TypeB("ABC"), TypeC(20)))
val s=MyGrp(Seq(grp1,grp2))
println(s.toCustString)   // "2|ABC|20.0|"

Upvotes: 1

Related Questions