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

Scala展平字符串列表和列表[String],scala,collections,functional-programming,Scala,Collections,Functional Programming,需要有关Scala展平的帮助 我有一个String和list[String]的列表 示例:List(“我”、“不能”、List(“做”、“这个”)) 预期结果:列出(“我”、“不能”、“做”、“这个”) 我做了很多实验,最紧凑的解决方案是: val flattenList = list.flatten { case list: List[Any] => list case x => List(x) } 但这似乎很棘手,也很难理解。对更简单的代码有什么建议吗 谢谢。我认为您无

需要有关Scala展平的帮助

我有一个
String
list[String]
的列表

示例:
List(“我”、“不能”、List(“做”、“这个”))

预期结果:
列出(“我”、“不能”、“做”、“这个”)

我做了很多实验,最紧凑的解决方案是:

val flattenList = list.flatten {
  case list: List[Any] => list
  case x => List(x)
}
但这似乎很棘手,也很难理解。对更简单的代码有什么建议吗


谢谢。

我认为您无法避免处理两种情况:单一元素与列表。无论如何,你必须告诉你的程序该做什么。下面是一个更通用的实现,它处理任何深度的列表:

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)
但这看起来不是很安全。尝试使用树或其他东西。

在同一列表中混合不同类型的元素是“棘手且难以理解”的。这是你问题的根本原因。一旦你有了它,就没有办法去扫描列表,检查每个元素的类型来纠正它,你的解决方案和任何解决方案一样好(当然,比另一个答案中建议的要好:)


如果我是你的话,我真的会重新思考导致像这样的异构列表的代码路径。这并不是一个好方法,因为这样会破坏类型安全性,并最终得到一个
列表[AnyRef]
,其中可能包含。。。什么都行

您是否尝试过将列表展平。如果是这样,为什么它对您不起作用?@maasg:
flatte
不会起作用,因为列表包含不同的数据类型,包括String和list[String],我想@antonkw想知道这是如何起作用的<代码>展平假定该列表包含另一个列表。所以,
case list
只是按原样使用,而
case x
将x转换为list<代码>展平文档中的示例将很有帮助:@antonkw为什么需要这个?这种方法的问题是
List[Any]
可能是任何东西,因此您失去了类型安全性。是否可以更改此列表的创建点,以便将
字符串
包装在列表中?像这样:
List(List(“I”)、List(“can”)、List(“do”、“this”))
相反?是的。你说得对。我是scala新手,有时候语言的特性会导致糟糕的解决方案,因为它们可以工作:),但在这种情况下,我应该开始重构。谢谢,正是我的想法。我很想+1,但严格来说,这更像是一个评论,而不是一个答案。@maasg这是一个答案,好吧。问题是,这是否是一种比OP更好的扁平化方法。答案是“不”。)经过深思熟虑+1:-)