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