12

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

我试图压缩它们,我得到了一个嵌套列表,我不能将它应用到 f​​latten 上,因为它说:没有隐式参数匹配参数类型。

我该如何解决这个问题?我应该尝试另一种方式还是有什么方法可以使扁平化工作?

我对 scala 有点陌生,所以这可能是一个愚蠢的问题:D 在此先感谢!克劳

4

7 回答 7

23

对于一个嵌套列表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))

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

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)

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

于 2013-04-16T18:23:46.393 回答
15

在 Scala 2.9 之前

从您粘贴的错误来看,您似乎正在尝试调用flatten嵌套列表本身的实例方法。这需要隐式转换才能Iterable从 List 包含的任何类型中生成某种类型。在您的情况下,编译器似乎找不到一个。

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)

Scala 2.9 之后

只需使用foo.flatten.

于 2009-11-15T13:18:33.930 回答
4

这个问题非常模糊。你应该简单地粘贴你所拥有的,而不是试图描述它。这将使每个人(包括您的)的生活更加轻松。

下面的代码是一个基于您所拥有的假设的示例。

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))
于 2009-11-15T23:17:26.993 回答
2

在 Scala 2.10.2 中

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

为此我写了函数

scala> def flat(ls: List[Any]): List[Any]= ls flatten {
     |   case t: List[Any] =>  flat(t)
     |   case c => List(c)
     | }   
flat: (ls: List[Any])List[Any]

scala> flat(List(List(1,2),2,List(2.3)))
res2: List[Any] = List(1, 2, 2, 2.3)
于 2013-10-14T09:16:30.293 回答
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)
于 2009-11-15T13:18:24.897 回答
1

您一次只能压缩两个列表list1 zip list2,并且返回值的类型签名List[(A,B)]不是List[List[obj1],List[obj2],List[obj3],List[obj4]]

于 2009-11-15T13:19:28.700 回答
0

List.concat例如考虑

List.concat(List(1), List(2,22), List(3))    // delivers List(1, 2, 22, 3)
于 2016-08-12T05:51:33.707 回答