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

List 如何在Scala中展平不同类型的列表?,list,scala,nested,flatten,List,Scala,Nested,Flatten,我有4个元素:List[List[Object]](每个元素中的对象不同),我想压缩它们,这样我就可以有一个List[List[obj1]、List[obj2]、List[obj3]、List[obj4] 我试着压缩它们,得到了一个嵌套的列表,我无法应用flatte,因为它说:没有与参数类型匹配的隐式参数 我怎样才能解决这个问题?我应该尝试另一种方法,还是有什么方法可以让扁平化工作 我是scala的新手,所以这可能是个愚蠢的问题:D 提前谢谢! clau如果我们有一个例子,它会有所帮助。您的代码

我有4个元素:
List[List[Object]]
(每个元素中的对象不同),我想压缩它们,这样我就可以有一个
List[List[obj1]、List[obj2]、List[obj3]、List[obj4]

我试着压缩它们,得到了一个嵌套的列表,我无法应用flatte,因为它说:没有与参数类型匹配的隐式参数

我怎样才能解决这个问题?我应该尝试另一种方法,还是有什么方法可以让扁平化工作

我是scala的新手,所以这可能是个愚蠢的问题:D 提前谢谢!
clau

如果我们有一个例子,它会有所帮助。您的代码应该如下所示:

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

List.flatten(top) // returns List(1, 2, 3, 4)
Scala 2.9之前 从粘贴的错误来看,似乎您正在尝试调用嵌套列表本身的
flant
实例方法。这需要隐式转换,以使列表中包含的任何类型的内容都具有
Iterable
。在您的情况下,编译器似乎找不到

列表
单例对象中使用
展平
,该对象不需要隐式参数:

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)
Scala 2.9之后
只需使用
foo.flatte

使用
list1-zip-list2
一次只能压缩两个列表,返回值的类型签名是
List[(a,B)]
而不是
List[List[obj1],List[obj2],List[obj3],List[obj4]
问题非常模糊。你应该简单地粘贴你所拥有的,而不是试图描述它。这将使每个人(包括你的家人)的生活变得更加轻松

下面的代码是一个基于假设的示例

scala> List(List(1))
res0: List[List[Int]] = List(List(1))

scala> List(List(2))
res1: List[List[Int]] = List(List(2))

scala> List(List(3))
res2: List[List[Int]] = List(List(3))

scala> List(List(4))
res3: List[List[Int]] = List(List(4))

scala> res0 ::: res1 ::: res2 ::: res3
res4: List[List[Int]] = List(List(1), List(2), List(3), List(4))

对于一个嵌套列表
展平
可以:

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))
对于多个嵌套列表,您可以:

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)

它在scala 2.10.2中打印列表(1、2、3、4、5、6、7、8)

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

scala> foo.flatten
res0: List[Any] = List(1, 2, a, 2.3)
工作很好,但是

如果你像我一样跑步

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

scala> foo.flatten
<console>:9: error: No implicit view available from Any => scala.collection.GenTraversableOnce[B].
              foo.flatten

例如,考虑一下
List.concat

List.concat(List(1), List(2,22), List(3))    // delivers List(1, 2, 22, 3)

谢谢大家:)我有点明白展平方法并不是我想要的,我想我用for解决了这个问题。谢谢你的好建议:)现在(2.9.1)它被弃用了。@macias:你可以做:
foo.flatte
List.concat(List(1), List(2,22), List(3))    // delivers List(1, 2, 22, 3)