Scala 将序列缩放为序列的序列

Scala 将序列缩放为序列的序列,scala,Scala,我有一个序列: Seq(1,2,3) 我试图得到一个序列的一个序列,它看起来像这样: Seq(Seq(1), Seq(1,2), Seq(1,2,3)) 以下是我的想法: def pop(acc: Seq[Seq[Int]], elems: Seq[Int]): Seq[Int] = elems match { case Nil => acc.flatten case x :: xs => pop(acc ++ Seq(Seq(x, xs.hea

我有一个序列:

Seq(1,2,3) 
我试图得到一个序列的一个序列,它看起来像这样:

Seq(Seq(1), Seq(1,2), Seq(1,2,3))
以下是我的想法:

  def pop(acc: Seq[Seq[Int]], elems: Seq[Int]): Seq[Int] = elems match {
    case Nil => acc.flatten
    case x :: xs =>
      pop(acc ++ Seq(Seq(x, xs.head)), xs.tail)
  }
正如所料,我在做xs.head的地方遇到了一个NosTouchElementException。我肯定有什么我做错了!可能是我错过了。这一次并没有给我预期的结果,但这只是一次尝试

编辑:最初的目标是分割一个字符串,其形式如下:

“1.2.3”到一系列字符串,如Seq(“1”)、Seq(“1.2”)、Seq(“1.2.3”)

为了实现这一点,我首先基于。字符,遍历生成的序列,并使用。字符。

差不多了:

  def pop(acc: Seq[Seq[Int]], elems: Seq[Int]): Seq[Seq[Int]] = elems match {
    case Nil => acc
    case x :: xs =>
      if (acc.isEmpty)
        pop(Seq(Seq(x)), xs)
      else
        pop(acc ++ Seq(acc.last ++ Seq(x)), xs)
  }
您还可以使用
inits
实现这一点(效率不高,但简洁):

scala> Seq(1,2,3).inits.toList.reverse.tail
res0: List[Seq[Int]] = List(List(1), List(1, 2), List(1, 2, 3))
编辑: 根据问题更新,查找一个字符串的所有前缀(最多一个“.”分隔符)的类似方法是将该字符串视为一个字符序列:

"1.2.3".inits.filter(s => s.nonEmpty && !s.endsWith(".")).toList.reverse

如果您的
Seq
没有重复项且已订购,您可以执行以下操作:

val yourSeq = Seq(1,2,3)
yourSeq.map(e => Seq(yourSeq.takeWhile(_ <= e))).flatten
val yourSeq=Seq(1,2,3)
yourSeq.map(e=>Seq)(yourSeq.takeWhile(

如果列表较长,则在
scanleet
中的
Seq
末尾追加可能会花费太多。在这种情况下,您可以在列表前添加一个反向步骤,或者使用一些可变生成器(如
ListBuffer
).

酷!为什么这样做很有效?它会遍历输入两次-一次创建
inits
结果,一次反转结果。当然,这只对大列表有意义,对于短列表,这是可以忽略的。我想我喜欢这一点,因为在我的Seq中,我永远不会有超过3个元素!很高兴有帮助!尽管我必须承认我发现了@Landei的解决方案(使用
scanLeft
)更加优雅,希望我自己也能想到:)你介意再看一下我的问题吗?我现在已经编辑了它!+1,还有另一个使用
index
:使用
input.indexs.map(I=>input.take(I+1))
相同精神的变体
 Seq(1,2,3).scanLeft(Seq[Int]())(_ :+ _).tail
val input = Seq(1,2,3)
val result = (1 to input.length).map(input.take).toList // List(List(1), List(1, 2), List(1, 2, 3))