【问题标题】:Scala containsSlice implementationScala containsSlice 实现
【发布时间】:2021-10-17 22:14:21
【问题描述】:

在 scala containsSlice 中,如果我们在 List 中有一个保持顺序的子列表,则返回 true。例如。

val sublst = List(1,2,3,4)
val lst = List(1,2,3,4,5,6)
println(lst.containsSlice(sublst)) // true

有没有办法不用这个方法来写这个逻辑?

【问题讨论】:

  • 你觉得这个方法是怎么写的?有人写的。所以,这个方法的存在就是这个方法可以写的不可否认的证明。
  • 是的。这就是我正在寻找的如何使用基本的语言结构来编写它。
  • 其实很简单。描述你如何在没有编程的情况下实际检查子列表。在您的程序中实施这些确切的步骤。

标签: list scala slice


【解决方案1】:
def subList[A](sub: List[A], mainlist: List[A]): Boolean =
  if (mainlist.size < sub.size) false
  else if (sub == mainlist.take(sub.size)) true
  else subList(sub, mainlist.drop(1))

【讨论】:

  • 我强烈建议取消 size 检查,因为它会遍历两个列表。
  • 那个take也每次都在创建一个新的List,然后再比较然后扔掉。
【解决方案2】:

如果可以使用其他库函数,那么这将起作用:

def containsSlice[T](list: List[T], slice: List[T]): Boolean = {
  @annotation.tailrec
  def loop(l: List[T]): Boolean =
    l.nonEmpty && (l.startsWith(slice) || loop(l.tail))

  slice.isEmpty || loop(list)
}

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2014-09-22
    相关资源
    最近更新 更多