我有4个元素:List[List[Object]]
(每个元素中的对象不同)我想要压缩,以便我可以拥有List[List[obj1],List[obj2],List[obj3],List[obj4]]
我试图压缩它们,我获得了一个嵌套列表,我无法将其展平,因为它说:没有隐式参数匹配参数类型。
我该如何解决这个问题?我应该尝试另一种方式,还是有办法使扁平化工作?
我对斯卡拉有点新意,所以这可能是一个愚蠢的问题:D 提前致谢! clau
答案 0 :(得分: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))
对于多个嵌套列表,您可以:
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)
答案 1 :(得分:14)
根据您粘贴的错误,您似乎正在尝试调用嵌套列表本身的flatten
实例方法。这需要隐式转换,以使List包含的任何类型的Iterable
类型。在您的情况下,看起来编译器找不到。
使用flatten
单例对象中的List
,该对象不需要隐式参数:
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)
只需使用foo.flatten
。
答案 2 :(得分: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))
答案 3 :(得分: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)
答案 4 :(得分: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)
答案 5 :(得分:1)
您只能使用list1 zip list2
一次压缩两个列表,并且返回值的类型签名为List[(A,B)]
而不是List[List[obj1],List[obj2],List[obj3],List[obj4]]
答案 6 :(得分:0)
考虑List.concat
,例如
List.concat(List(1), List(2,22), List(3)) // delivers List(1, 2, 22, 3)