Scala 如何将序列拆分为子序列?

Scala 如何将序列拆分为子序列?,scala,collections,Scala,Collections,假设我有一个整数序列,需要将其拆分为如下子序列: def splitBySeq(xs: Seq[Int], ys: Seq[Int]): (Seq[Int], Seq[Int]) = ??? val xs = List(1, 2, 3, 4, 5) splitBySeq(xs, Nil) // (List(1, 2, 3, 4, 5), Nil) splitBySeq(xs, List(1)) // (Nil, List(2, 3, 4,

假设我有一个整数序列,需要将其拆分为如下子序列:

def splitBySeq(xs: Seq[Int], ys: Seq[Int]): (Seq[Int], Seq[Int]) = ???

val xs = List(1, 2, 3, 4, 5)
splitBySeq(xs, Nil)                 // (List(1, 2, 3, 4, 5), Nil)
splitBySeq(xs, List(1))             // (Nil, List(2, 3, 4, 5))
splitBySeq(xs, List(5))             // (List(1, 2, 3, 4), Nil)
splitBySeq(xs, List(3, 4))          // (List(1, 2), List(5))
splitBySeq(xs, List(11, 12))        // (List(1, 2, 3, 4, 5), Nil)
splitBySeq(xs, List(1, 2, 3, 4, 5)) // (Nil, Nil)
如果ys是xs的子序列,那么函数应该返回一对序列-xs1和xs2,这样xs1++ys++xs2==xs。否则,函数返回xs


您将如何实现splitBySeq?

这似乎说明了您的目标

def splitBySeq(xs: Seq[Int], ys: Seq[Int]): (Seq[Int], Seq[Int]) = {
  val idx = xs indexOfSlice ys
  if (idx < 0) (xs, Nil)
  else {
    val (a,b) = xs splitAt idx
    (a, b drop ys.length)
  }
}

请注意,在第一个测试用例splitBySeqxs,Nil中,结果seqs被切换,因为Nil匹配任何Seq的零索引。

这似乎是您所追求的

def splitBySeq(xs: Seq[Int], ys: Seq[Int]): (Seq[Int], Seq[Int]) = {
  val idx = xs indexOfSlice ys
  if (idx < 0) (xs, Nil)
  else {
    val (a,b) = xs splitAt idx
    (a, b drop ys.length)
  }
}

注意,在第一个测试用例splitBySeqxs,Nil中,结果seqs被切换,因为Nil匹配任何Seq的零索引。

另一个解决方案,尾部递归函数进行一次迭代:

def splitBySeq[A](xs: Seq[A], ys: Seq[A]): (Seq[A], Seq[A]) = {

  @tailrec
  def go(a: List[A], b: List[A], acc: List[A], rest: List[A]): (Seq[A], Seq[A]) = {

    (a, b) match {
      case (z :: zs, w :: ws)  => {
        if(z == w) {
          go(zs, ws, z :: acc, rest)
        } else{
          go(zs, ys.toList, Nil, z :: (acc ++ rest))
        }
      }
      case (zs, Nil) => (rest.reverse, zs)
      case (Nil, _) => (rest.reverse, Nil)
    }
  }

  if(ys.isEmpty) {
    (xs, Nil)
  } else {
    go(xs.toList, ys.toList, Nil, Nil)
  }

}

另一种解决方案,尾部递归函数执行一次迭代:

def splitBySeq[A](xs: Seq[A], ys: Seq[A]): (Seq[A], Seq[A]) = {

  @tailrec
  def go(a: List[A], b: List[A], acc: List[A], rest: List[A]): (Seq[A], Seq[A]) = {

    (a, b) match {
      case (z :: zs, w :: ws)  => {
        if(z == w) {
          go(zs, ws, z :: acc, rest)
        } else{
          go(zs, ys.toList, Nil, z :: (acc ++ rest))
        }
      }
      case (zs, Nil) => (rest.reverse, zs)
      case (Nil, _) => (rest.reverse, Nil)
    }
  }

  if(ys.isEmpty) {
    (xs, Nil)
  } else {
    go(xs.toList, ys.toList, Nil, Nil)
  }

}

splitBySeqxs,List5和splitBySeqxs,List3,4的示例结果与您的描述不匹配。同意。我会修好的。谢谢。splitBySeqxs,List5和splitBySeqxs,List3,4的示例结果与您的描述不匹配。同意。我会修好的。谢谢