在为我的系统的某些部分编写测试时,我发现了一些奇怪的行为,如果仔细检查,这些行为可以归结为以下几点:
scala> List(0, 1, 2, 3).sliding(2).toList
res36: List[List[Int]] = List(List(0, 1), List(1, 2), List(2, 3))
scala> List(0, 1, 2).sliding(2).toList
res37: List[List[Int]] = List(List(0, 1), List(1, 2))
scala> List(0, 1).sliding(2).toList
res38: List[List[Int]] = List(List(0, 1))
scala> List(0).sliding(2).toList //I mean the result of this line
res39: List[List[Int]] = List(List(0)) 在我看来,这就像List.sliding(),许多其他类型的sliding()实现违反了文档中提供的保证。
def sliding(size: Int): Iterator[List[A]]通过在固定大小块上传递“滑动窗口”对元素进行分组(而不是像分组中那样对它们进行分区)。 大小:每个组的元素数 返回:是一个生成大小列表的迭代器,除了最后一个和唯一的元素之外,如果元素少于size,那么将被截断。
据我所知,可以保证可以使用sliding(2)返回的迭代器迭代的所有列表都是长度为2的。我很难相信这是一个一直到目前版本的scala的bug,所以也许对此有解释,或者我误解了文档?
我使用的是“ScalaVersion2.10.3 (OpenJDK 64位服务器VM,Java 1.7.0_25)”。
发布于 2014-03-09 13:20:57
不,没有这样的保证,而且您基本上强调了明确声明的doc行。这又是一个不同的重点:
返回:生成大小为
size.的列表的迭代器,除了最后一个和唯一的元素,如果比少的话,将被截断。
因此,如果您有一个具有长度n**,的列表,并调用** .sliding(m)**,,其中** m > n**, _是结果的最后一个和唯一的元素_,其长度为** n.
在以下情况下:
List(0).sliding(2)只有一个元素(n = 1),您可以调用sliding(2),即m = 2, 2 > 1,这将导致结果的最后一个也是唯一的元素被截断为1。
https://stackoverflow.com/questions/22282486
复制相似问题