需要Scala展平的帮助。
我有一个String
和List[String]
的列表。
示例:List("I", "can't", List("do", "this"))
期待结果:List("I", "can't", "do", "this")
我做了很多实验,最紧凑的解决方案是:
val flattenList = list.flatten {
case list: List[Any] => list
case x => List(x)
}
但它似乎非常棘手且难以理解。有关更天真代码的任何建议吗?
感谢。
答案 0 :(得分:3)
什么是“棘手且难以理解”的是同一列表中不同类型的混合元素。这是你问题的根本原因。一旦你有了,就无法扫描列表,并检查每个元素的类型以纠正它,你的解决方案就像任何一个一样好(当然,比另一个更好)回答:))。
我真的会重新思考代码路径,如果我是你,那么首先会产生这样的异构列表。这不是一个好方法,因为你以这种方式颠覆了类型的安全性,最终得到了一个List[AnyRef]
,它可以包含......好吧,任何东西。
答案 1 :(得分:1)
我认为你不能避免不得不处理2个案例:单个元素与列表。无论如何,你必须告诉你的程序该做什么。这是一个更通用的实现,它处理任何深度的列表:
def flattenList(xs: List[Any]): List[Any] =
xs match {
case Nil => Nil
case (ys:List[_]) :: t => flattenList(ys) ::: flattenList(t)
case h :: t => h :: flattenList(t)
}
示例:
scala> flattenList(List("I", "can't", List("do", "this")))
res1: List[Any] = List(I, can't, do, this)
scala> flattenList(List("I", "can't", List("do", List("this", "and", "this"))))
res2: List[Any] = List(I, can't, do, this, and, this)
虽然看起来不太安全。尝试使用树或其他东西。