我的序列为:
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的地方击中了一个NosuchelementException。我敢肯定,我一定有一些事情"我做错了!我可能会失踪。这不是给我预期的结果,但这只是一个尝试!
编辑:最初的目标是拆分一个符合:
的字符串" 1.2.3"到一系列字符串,如seq(" 1),seq(" 1.2"),seq(" 1.2.3")
为了实现这一目标,我首先是根据。角色,越过结果序列,并将它们再次与。字符。
Seq(1,2,3).scanLeft(Seq[Int]())(_ :+ _).tail
如果列表更长,则在scanLeft
中的Seq
末尾附加可能变得太昂贵了。在这种情况下,您可以将其预先列入列表,并添加一个反向步骤,或使用一些可变的构建器(例如ListBuffer
)。
您也可以使用 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
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))
几乎存在:
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)
}
如果您的Seq
没有重复项并订购,则可以:
val yourSeq = Seq(1,2,3)
yourSeq.map(e => Seq(yourSeq.takeWhile(_ <= e))).flatten