List 检查是否存在子列表

List 检查是否存在子列表,list,scala,scala-collections,List,Scala,Scala Collections,您能提供一种执行(可能是惯用)方法来检查列表a是否是给定列表B的子列表吗 例如 一种方法是将用于all和contains: scala> List(1, 2).forall(List(1, 2, 3, 4).contains) res3: Boolean = true scala> List(1, 2).forall(List(5, 6, 7, 8).contains) res4: Boolean = false scala> List(1, 2).forall

您能提供一种执行(可能是惯用)方法来检查列表
a
是否是给定列表
B
的子列表吗

例如


一种方法是将
用于all
contains

scala>   List(1, 2).forall(List(1, 2, 3, 4).contains)
res3: Boolean = true

scala>   List(1, 2).forall(List(5, 6, 7, 8).contains)
res4: Boolean = false

scala>   List(1, 2).forall(List(5, 6, 2, 9).contains)
res5: Boolean = false

注意,该方法不考虑排序:

scala>   List(1, 2).forall(List(2, 1).contains)
res6: Boolean = true

可能您也可以使用
Set
s和
intersect
,但我认为这种方式更可取。

如果顺序很重要,您可以使用containsSlice,它检查集合是否包含作为片段的给定序列

def isSubList[A](l1:List[A], l2:List[A]) = l2.containsSlice(l1)
还有一个解决方案:

def isSubList[A](short: List[A], long: List[A]): Boolean =
    long.tails exists (_.startsWith(short))
但是,如果先将列表转换为流,效率会更高:

def isSubList[A](short: List[A], long: List[A]): Boolean = {
    val sLong = long.toStream
    val sShort = short.toStream
    sLong.tails exists (_.startsWith(sShort))
}

这样,就不必生成所有尾部。此外,StartWith以短路方式进行评估

不清楚您想要的是子集还是切片。例如,
List(1,3)
List(1,2,3)
的子列表吗(很明显,它是
List(1,3,5)
的子列表)?重复问题请看,在实践中,不应该将类似
List(1,2,3,4)
的东西放在lambda中,因为它会反复创建列表。如果顺序很重要:
def isSubList[a](short:Seq[A],long:Seq[A]):Boolean=long.containsSlice(short)
。如果有帮助,请点击海报下方的帖子!更易读:
def isSubList[A](short:Seq[A],long:Seq[A]):Boolean=long.containsSlice(short)
def isSubList[A](short: List[A], long: List[A]): Boolean = {
    val sLong = long.toStream
    val sShort = short.toStream
    sLong.tails exists (_.startsWith(sShort))
}