相关疑难解决方法(0)

压缩多个序列

我正在尝试zip多个序列来形成一个长元组:

val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)

ints zip chars zip strings zip bools
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

List[(((Int, Char), String), Boolean)] =
  List((((1,a),Alpha),true), (((2,b),Beta),false), (((3,c),Gamma),false))
Run Code Online (Sandbox Code Playgroud)

但是我想得到一系列扁平元组:

List[(Int, Char, String, Boolean)] = 
  List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))
Run Code Online (Sandbox Code Playgroud)

我现在能做到:

List(ints, chars, strings, bools).transpose
Run Code Online (Sandbox Code Playgroud)

但它返回的是弱类型List[List[Any]].我也可以做(ints, chars, strings).zipped,但zipped只适用于2元组和3元组.

有没有办法轻松地压缩(任意)数量的等长序列?

scala tuples

34
推荐指数
4
解决办法
2万
查看次数

组合多个任意长度的列表

我正在寻找以下列方式加入多个列表的方法:

ListA a b c
ListB 1 2 3 4
ListC + # * § %
..
..
..

Resulting List: a 1 + b 2 # c 3 * 4 § %
Run Code Online (Sandbox Code Playgroud)

单词:按顺序排列的元素,从第一个列表开始合并到结果列表中.任意数量的输入列表的长度可以不同.

我使用了zip的变体,滑动迭代器的多种方法但没有工作,特别是处理不同的列表长度.在scala中必须有一种优雅的方式;)

scala scala-collections

14
推荐指数
2
解决办法
3082
查看次数

在Scala中是否有一种安全的方法来转置不等长列表的列表?

鉴于以下列表:

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

如果我尝试转置它,Scala将抛出以下错误:

scala> List.transpose(l)
java.util.NoSuchElementException: head of empty list
    at scala.Nil$.head(List.scala:1365)
    at scala.Nil$.head(List.scala:1362)
    at scala.List$$anonfun$transpose$1.apply(List.scala:417)
    at scala.List$$anonfun$transpose$1.apply(List.scala:417)
    at scala.List.map(List.scala:812)
    at scala.List$.transpose(List.scala:417)
    at .<init>(<console>:6)
    at .<clinit>(<console>)
    at RequestResult...
Run Code Online (Sandbox Code Playgroud)

这是因为List.transpose假设等长列表,所以使用head方法:

def transpose[A](xss: List[List[A]]): List[List[A]] = {
  val buf = new ListBuffer[List[A]]
  var yss = xss
  while (!yss.head.isEmpty) {
    buf += (yss map (_.head))
    yss = (yss map (_.tail))
  }
  buf.toList
}
Run Code Online (Sandbox Code Playgroud)

我想得到以下内容:

List(List(1, 4, 6), List(2, 5, …
Run Code Online (Sandbox Code Playgroud)

transpose scala list

11
推荐指数
1
解决办法
5875
查看次数

使用4(或N)个集合一次只能产生一个值(1xN)(即为tuple4 +压缩)

scala> val a = List(1,2)
a: List[Int] = List(1, 2)

scala> val b = List(3,4)
b: List[Int] = List(3, 4)

scala> val c = List(5,6)
c: List[Int] = List(5, 6)

scala> val d = List(7,8)
d: List[Int] = List(7, 8)

scala> (a,b,c).zipped.toList
res6: List[(Int, Int, Int)] = List((1,3,5), (2,4,6))
Run Code Online (Sandbox Code Playgroud)

现在:

scala> (a,b,c,d).zipped.toList
<console>:12: error: value zipped is not a member of (List[Int], List[Int], List[Int],     List[Int])
              (a,b,c,d).zipped.toList
                       ^
Run Code Online (Sandbox Code Playgroud)

我在其他地方搜索过这个,包括这个这个,但没有确定的答案.

我想做以下或类似的事情:

for((itemA,itemB,itemC,itemD) <- (something)) yield itemA + itemB …
Run Code Online (Sandbox Code Playgroud)

collections scala tuples for-comprehension

6
推荐指数
1
解决办法
709
查看次数

Scala,将多个列表转换为元组列表

我有3个列表

val a = List("a", "b", "c")
val b = List(1, 2, 3)
val c = List(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)

我想将它们转换如下

List(("a", 1, 4), ("b", 2, 5), ("c", 3, 6))
Run Code Online (Sandbox Code Playgroud)

请告诉我如何获得此结果

scala

5
推荐指数
3
解决办法
5392
查看次数