相关疑难解决方法(0)

在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
查看次数

标签 统计

list ×1

scala ×1

transpose ×1