当我需要在n个元素的组中迭代集合而不重新处理任何元素时,我发现自己最近使用了滑动(n,n).我想知道使用分组(n)迭代这些集合是否更为正确.我的问题是,是否有特殊原因在性能方面使用这一特定情况.
val listToGroup = List(1,2,3,4,5,6,7,8)
listToGroup: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)
listToGroup.sliding(3,3).toList
res0: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8))
listToGroup.grouped(3).toList
res1: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8))
Run Code Online (Sandbox Code Playgroud)
chi*_*ong 19
当你想让'windows'的长度与你'滑动'的长度不同时(也就是说,使用where )时,使用sliding而不是使用它的原因才grouped真正适用:sliding(m, n)m != n
listToGroup.sliding(2,3).toList
//returns List(List(1, 2), List(4, 5), List(7, 8))
listToGroup.sliding(4,3).toList
//returns List(List(1, 2, 3, 4), List(4, 5, 6, 7), List(7, 8))
Run Code Online (Sandbox Code Playgroud)
正如som-snytt在评论中指出的那样,不会有任何性能差异,因为它们都是在Iterator返回新内容时实现的GroupedIterator.但是,它grouped(n)比编写更简单sliding(n, n),并且您的代码在其预期行为中会更清晰,更明显,所以我建议grouped(n).
作为在哪里使用的示例sliding,请考虑这个示例,其中grouped仅仅是不够的:
给定一个数字列表,长度为4的子列表具有最大的总和.
现在,抛开动态编程方法可以产生更有效的结果的事实,这可以解决为:
def maxLengthFourSublist(list: List[Int]): List[Int] = {
list.sliding(4,1).maxBy(_.sum)
}
Run Code Online (Sandbox Code Playgroud)
如果您在grouped这里使用,则不会获得所有子列表,因此sliding更合适.