Scala展平字符串和列表[String]

时间:2016-10-31 08:51:18

标签: scala collections functional-programming

需要Scala展平的帮助。

我有一个StringList[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)
}

但它似乎非常棘手且难以理解。有关更天真代码的任何建议吗?

感谢。

2 个答案:

答案 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)

虽然看起来不太安全。尝试使用树或其他东西。