scala中的“unlist”(例如展平一系列序列的序列......)

Posted

技术标签:

【中文标题】scala中的“unlist”(例如展平一系列序列的序列......)【英文标题】:"unlist" in scala (e.g flattening a sequence of sequences of sequences...) 【发布时间】:2015-04-20 22:53:35 【问题描述】:

Scala 中是否有一种简单的方法可以将嵌套的序列序列(等)序列展平或“取消列出”为这些事物的简单序列,而无需任何嵌套结构?

【问题讨论】:

Generic, type-safe way to flatten arbitrarily nested collections in Scala? 的可能重复项 另请参阅我的一些相关答案中关于深度反向here 的讨论。 我想到的最简单的方法是循环运行提供的 flatten 函数,直到它的输出等于它的输入。我认为大多数集合都有 flatten 功能,但我只检查了 List、Seq 和 Array。 【参考方案1】:

我不认为有一种 flatten` 方法可以将深度嵌套转换为序列。

编写一个简单的递归函数很容易做到这一点


def flatten(ls: List[Any]): List[Any] = ls flatMap 
    case ms: List[_] => flatten(ms)
    case e => List(e)
   
 val a =  List(List(List(1, 2, 3, 4, 5)),List(List(1, 2, 3, 4, 5)))
 flatten(a)
 //> res0: List[Any] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
 

【讨论】:

这在紧要关头很有效,但这里提供的解决方案:***.com/questions/12160596/… 是类型安全的 抱歉这个问题,但你不应该写+Any吗? @BenReich - OP 想要一种简单的方法,并且您的链接中给出的解决方案对于一个简单的案例来说过于复杂(即,如果它只是列表等的嵌套) @DmitryGinzburg - 它甚至不能用 +Any 编译 :) 对不起,但我不知道你在做什么 @mohit 我同意——我只是想说有一个可用的类型安全选项,所以如果这是一个常见问题,那么该选项更可取!

以上是关于scala中的“unlist”(例如展平一系列序列的序列......)的主要内容,如果未能解决你的问题,请参考以下文章

Scala 展平深度函数混淆

展平Scala中的元组列表?

Scala嵌套数组展平

Scala中的嵌套与展平模式匹配

在 Scala 中用不同的 DataType 展平一个 DataFrame

Scala系列