Scala中如何扁平化含空数组的数组?flatten函数适配问题
解决Array[_ <: Int]无法使用flatten并过滤空数组的问题
我懂你碰到的麻烦了——当你手里有个包含空数组的数组,想把它扁平化同时去掉空数组的时候,直接用flatten却报错,说这个函数不适用于Array[_ <: Int]类型对吧?这其实是因为Scala里flatten的工作要求:它需要集合里的每个元素本身是可遍历的(比如数组、列表这类实现了TraversableOnce的类型),但_ <: Int是Int的子类型,Int本身可不是可遍历的,编译器自然不买账。
下面分两种常见情况给你解决方案:
情况1:你的数组实际是Array[Array[Int]]
如果你的数组里的元素全是Int数组(只是混了空数组),那处理起来很简单:先过滤掉空数组,再调用flatten就行:
// 示例输入:包含空数组的Int数组 val input = Array(Array(1, 2), Array(), Array(3, 4), Array()) // 先过滤空数组,再扁平化 val output = input.filter(_.nonEmpty).flatten // 输出结果:Array(1, 2, 3, 4)
情况2:你的数组是混合类型(比如同时有Int和Int数组)
如果你的数组里既有单个Int值,又有Int数组(类型被推断成了Array[Any],但你误当成了Array[_ <: Int]),那可以用flatMap结合模式匹配来处理,同时过滤空数组:
// 示例输入:混合了Int和Int数组的集合 val input: Array[Any] = Array(1, Array(2, 3), Array(), 4, Array()) val output = input.flatMap { // 匹配非空的Int数组,直接保留元素 case arr: Array[Int] if arr.nonEmpty => arr // 匹配单个Int值,包装成数组再返回 case num: Int => Array(num) // 其他情况(比如空数组)返回空数组,相当于过滤掉 case _ => Array.empty[Int] } // 输出结果:Array(1, 2, 3, 4)
另外要提醒你:如果是你自己错误地把Array[Array[Int]]声明成了Array[_ <: Int],那得先修正类型声明——因为Array[Int]并不是Int的子类型,这种错误声明本身会导致编译失败的哦。
内容的提问来源于stack exchange,提问作者lserlohn
相关产品推荐
相关产品推荐

