Scala中如何扁平化List[Any, List[]]?特定嵌套列表转换
嘿,我来帮你搞定这两个Scala列表处理的问题!
针对给定示例的转换
先看你给出的具体代码:
val xs = List(List(4, List(4, 7)), List(3, List(3, 5)), List(4, List(5, 9)))
要把它转换成List(List(4, 4, 7), List(3, 3, 5), List(4, 5, 9)),核心是处理每个子列表的结构——每个子列表都是「单个整数 + 整数列表」的组合。
你可以用map配合模式匹配来实现,代码很直观:
val result = xs.map { case List(num: Int, subList: List[Int]) => num :: subList }
代码解释
map遍历xs中的每一个子列表- 模式匹配
List(num: Int, subList: List[Int])精准解构出子列表里的单个整数和嵌套的整数列表 - 用
::把单个整数放到嵌套列表的头部,刚好拼成你想要的扁平子列表
如果想更安全(比如避免不符合结构的子列表导致运行时异常),可以换成collect,它会自动过滤掉不匹配模式的元素:
val result = xs.collect { case List(num: Int, subList: List[Int]) => num :: subList }
通用的扁平化嵌套列表(List[Any]类型)
如果你的列表是更通用的List[Any](里面混合了基本类型和任意层数的嵌套列表),比如List(1, List(2, List(3)), 4, "hello"),想要把它完全扁平化成只包含非列表元素的列表,可以写一个递归函数:
def flattenAnyList(list: List[Any]): List[Any] = list.flatMap { case subList: List[_] => flattenAnyList(subList) // 递归扁平化子列表 case element => List(element) // 单个元素包装成列表,方便flatMap拼接 }
如果只关心整数类型的扁平化(过滤掉非整数、非列表的元素),可以调整成:
def flattenIntList(list: List[Any]): List[Int] = list.flatMap { case subList: List[_] => flattenIntList(subList) case num: Int => List(num) case _ => Nil // 忽略非整数、非列表的元素 }
内容的提问来源于stack exchange,提问作者Ha Tran
相关产品推荐
相关产品推荐

