在Scala中,grouped
从左到右工作。
val list = List(1,2,3,4,5)
list.grouped(2).toList
=> List[List[Int]] = List(List(1, 2), List(3, 4), List(5))
但如果我想要怎么做:
=> List[List[Int]] = List(List(1), List(2, 3), List(4, 5))
我知道这很有效:
list.reverse.grouped(2).map(_.reverse).toList.reverse
然而,这似乎并不高效。
答案 0 :(得分:3)
然后你可以自己实现它:
def rgrouped[T](xs: List[T], n: Int) = {
val diff = xs.length % n
if (diff == 0) xs.grouped(n).toList else {
val (head, toGroup) = xs.splitAt(diff)
List(head, toGroup.grouped(n).toList.head)
}
}
相当难看,但应该有用。
答案 1 :(得分:1)
这是我的尝试:
def rightGrouped[T](ls:List[T], s:Int) = {
val a = ls.length%s match {
case 0 => ls.grouped(s)
case x => List(ls.take(x)) ++ ls.takeRight(ls.length-x).grouped(s)
}
a.toList
}
用法:
scala> rightGrouped(List(1,2,3,4,5),3)
res6: List[List[Int]] = List(List(1, 2), List(3, 4, 5))
我最初尝试过没有模式匹配,但是当列表是“偶数”时它是错误的
val ls = List(1,2,3,4,5,6)
val s = 3
val x = ls.length % s
List(ls.take(x)) ++ ls.takeRight(ls.length-x).grouped(s)
制备:
List(List(), List(1, 2, 3), List(4, 5, 6))
答案 2 :(得分:0)
val l =List(list.head)::(list.tail grouped(2) toList)
编辑:
在@ gzm0指出我的错误之后我已经修复了解决方案,虽然它仅适用于n = 2
def group2[T](list: List[T]) ={
(list.size % 2 == 0) match {
case true => list.grouped(2).toList
case false => List(list.head) :: (list.tail grouped(2) toList)
}
}
println(group2(List()))
println(group2(List(1,2,3,4,5)))
println(group2(List(1,2,3,4,5,6)))
List()
List(List(1), List(2, 3), List(4, 5))
List(List(1, 2), List(3, 4), List(5, 6))