如何在Scala中展平不同类型的列表?

cla*_*lau 11 scala nested list flatten

我有4个元素:( List[List[Object]]每个元素中的对象不同)我想要压缩,以便我可以拥有List[List[obj1],List[obj2],List[obj3],List[obj4]]

我试图压缩它们,我获得了一个嵌套列表,我不能应用flatten,因为它说:没有隐式参数匹配参数类型.

我怎么解决这个问题?我应该尝试另一种方式还是有办法让扁平化的工作?

我对scala有点新意,所以这可能是一个愚蠢的问题:D提前谢谢!clau

Jat*_*tin 21

对于一个嵌套列表: flatten将执行:

scala> List(List(1), List(2), List(3)).flatten
res4: List[Int] = List(1, 2, 3)

scala> List(List(List(1)), List(List(2)), List(List(3))).flatten
res5: List[List[Int]] = List(List(1), List(2), List(3))
Run Code Online (Sandbox Code Playgroud)

对于多个嵌套列表,您可以:

def flatten(ls: List[Any]): List[Any] = ls flatMap {
  case i: List[_] => flatten(i)
  case e => List(e)
}

val k = List(1, List(2, 3), List(List(List(List(4)), List(5)), List(6, 7)), 8)
flatten(k)
Run Code Online (Sandbox Code Playgroud)

它打印 List[Any] = List(1, 2, 3, 4, 5, 6, 7, 8)


Ben*_*mes 14

在Scala之前2.9

从您粘贴的错误中,您似乎正在尝试调用flatten嵌套列表本身的实例方法.这需要一个隐式转换,以使IterableList包含的任何类型的类型.在您的情况下,看起来编译器找不到一个.

使用flattenList单独的对象,它不需要隐含参数:

scala> val foo = List(List(1), List("a"), List(2.3))
foo: List[List[Any]] = List(List(1), List(a), List(2.3))

scala> List.flatten(foo)
res1: List[Any] = List(1, a, 2.3)
Run Code Online (Sandbox Code Playgroud)

在Scala 2.9之后

只是用foo.flatten.


Sha*_*aun 1

如果我们有一个例子会有所帮助。您的代码应该类似于:

val f = List(1, 2)
val s = List(3, 4)
val top = List(f, s)

List.flatten(top) // returns List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)