Scala序列到序列序列

时间:2016-06-22 09:02:28

标签: 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")

为实现这一目标,我首先要根据分裂进行分割。字符,遍历生成的序列并再次与它们连接。字符。

5 个答案:

答案 0 :(得分:7)

 Seq(1,2,3).scanLeft(Seq[Int]())(_ :+ _).tail

如果列表较长,则追加到Seq scanLeft的末尾可能会变得过于昂贵。在这种情况下,您可以添加到List,并添加反向步骤,或使用一些可变构建器(如ListBuffer)。

答案 1 :(得分:5)

您也可以使用inits

来实现这一目标(不是太有效,但要简明扼要)
scala> Seq(1,2,3).inits.toList.reverse.tail
res0: List[Seq[Int]] = List(List(1), List(1, 2), List(1, 2, 3))

修改: 每个问题更新,类似于查找字符串的所有前缀到“。”的方法。分隔符只是将String视为一系列Chars:

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

几乎就在那里:

  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)
  }

答案 4 :(得分:0)

如果您的> db.test1.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "mydb.test1" }, { "v" : 1, "unique" : true, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "name_text_lname_text", "ns" : "mydb.test1", "caseInsensitive" : true, "weights" : { "lname" : 1, "name" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ] > 没有重复且已订购,您可以执行以下操作:

Seq