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.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

最新更新