【问题标题】:Scala Sequence to a Sequence of SequenceScala序列到序列序列
【发布时间】:2016-06-22 09:02:27
【问题描述】:

我有一个序列:

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

为了实现这一点,我首先基于 .字符,遍历生成的序列并再次将它们与 . 连接起来。字符。

【问题讨论】:

标签: scala


【解决方案1】:
 Seq(1,2,3).scanLeft(Seq[Int]())(_ :+ _).tail

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

【讨论】:

    【解决方案2】:

    您也可以使用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
    

    【讨论】:

    • 酷!为什么这样有效?
    • 它遍历输入两次——一次创建inits结果,一次反转它。当然,这仅对大型列表很重要,对于较短的列表可以忽略不计。
    • 我想我喜欢在我的 Seq 中这样,我永远不会有超过 3 个元素!
    • 很高兴能帮上忙!虽然我必须承认我发现@Landei 的解决方案(使用scanLeft)更优雅,但希望我自己能想到:)
    • 您介意再看看我的问题吗?我现在已经编辑了!
    【解决方案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))
    

    【讨论】:

    • +1,以及另一个使用indices的相同精神变体:input.indices.map(i => input.take(i + 1))
    【解决方案4】:

    差不多了:

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

    【讨论】:

      【解决方案5】:

      如果您的Seq 没有重复且已订购,您可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-17
        • 2011-05-30
        • 2019-02-03
        • 2013-01-21
        • 2010-10-19
        • 2015-02-28
        • 2021-06-12
        • 2012-11-23
        相关资源
        最近更新 更多