拆分操作是把一个容器里的元素按一定的规则分割成多个子容器。
常用的拆分方法有partition、groupBy、grouped和sliding。
partition方法接受一个布尔函数,用该函数对容器元素进行遍历,以二元组的形式返回满足条件和不满足条件的两个 C[T]类型的集合。
val list=1 to 10
// partition拆分为二元组
println(list.partition(_<5))
输出结果
(Vector(1, 2, 3, 4),Vector(5, 6, 7, 8, 9, 10))
groupBy方法接受一个返回U类型的函数,用该函数对容器元素进行遍历,将返回值相同的元素作为一个子容器,并与该相同的值构成一个键值对,最后返回的是一个类型为Map[U,C[T]]的映射。
// groupedBy拆分为多元组
println(list.groupBy(_%5))
输出结果
Map(0 -> Vector(5, 10), 1 -> Vector(1, 6), 2 -> Vector(2, 7), 3 -> Vector(3, 8), 4 -> Vector(4, 9))
grouped和sliding方法都接受一个整型参数n,两个方法都将容器拆分为多个与原容器类型相同的子容器,并返回由这些子容器构成的迭代器,即Iterator[C[T]]。
其中,grouped按从左到右的方式将容器划分为多个大小为n的子容器(最后一个的大小可能小于n);sliding使用一个长度为n的滑动窗口,从左到右将容器截取为多个大小为n的子容器。
// grouped根据指定大小切分
val newList=list.grouped(3)
while (newList.hasNext){
println(newList.next())
}
输出结果
Vector(1, 2, 3)
Vector(4, 5, 6)
Vector(7, 8, 9)
Vector(10)
// sliding滑动切分
val newListSliding=list.sliding(3)
while (newListSliding.hasNext){
println(newListSliding.next())
}
输出结果
Vector(1, 2, 3)
Vector(2, 3, 4)
Vector(3, 4, 5)
Vector(4, 5, 6)
Vector(5, 6, 7)
Vector(6, 7, 8)
Vector(7, 8, 9)
Vector(8, 9, 10)