展平 Scala 中的嵌套对象

iTs*_*aMe 2 scala flatten flatmap

给定一个如下所示的复杂对象:

case class Complex
(
  id: Long,
  name: String,
  nested: Seq[Complex]
)
Run Code Online (Sandbox Code Playgroud)

在实际操作中,这可能会变成这样:

val stuff =
  List(
    Complex(1, "name1",
      List(
        Complex(2, "name2", List()),
        Complex(3, "name3",
          List(
            Complex(4, "name4", List())
          )
        )
      )
    )
  )
Run Code Online (Sandbox Code Playgroud)

我需要将其变成一个平面Complex对象列表,将所有子/孙子拉起来。

val flattened =
  List(
    Complex(1, "name1", List()),
    Complex(2, "name2", List()),
    Complex(3, "name3", List()),
    Complex(4, "name4", List()),
  )
Run Code Online (Sandbox Code Playgroud)

您对我如何实现这一目标有任何线索/想法吗?

我尝试过的其他解决方案似乎只做简单的列表嵌套。我尝试过的事情:

这些似乎都产生了与我开始时相同的列表。

Ant*_*tot 5

这里压平输入 Seq 的困难在于需要删除结果列表中的嵌套引用。这可以通过使用 = 空列表复制原始对象nested并展平所有序列来完成:

def flatten(obj: Complex): Seq[Complex] = {
  val unnested = obj.copy(nested = List())
  Seq(unnested) ++ obj.nested.flatMap(flatten)
}

println(stuff.flatMap(flatten))

List(
  Complex(1,name1,List()),
  Complex(2,name2,List()),
  Complex(3,name3,List()),
  Complex(4,name4,List())
  )
Run Code Online (Sandbox Code Playgroud)