【问题标题】:flatten a list of list to a single List of elements in scala将列表列表展平为scala中的单个元素列表
【发布时间】:2018-02-11 16:22:38
【问题描述】:

我想展平一个嵌套列表结构

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) 没有隐式视图 可从 Msg => scala.collection.GenTraversableOnce[B] 获得。
    s.list.flatten'

  2. s.list.map(x=>x.toCustString()) 但这给出了一个字符串形式,我想列一个列表

【问题讨论】:

    标签: scala


    【解决方案1】:

    您可以将flatMap 与模式匹配,将非Grps 包装到一个单元素列表中:

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

    【讨论】:

    • thks 我有一个列表。现在我想将它们转换为一个带有分隔符的列表,例如 "|"
    • 不适用于更深层次的嵌套:MyGrp(Seq(MyGrp(Seq(MyGrp(Seq(TypeA(0)))))))
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2016-09-06
    • 2016-01-26
    • 1970-01-01
    • 2018-04-15
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多