例如,给定:
List(5, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
我想了解以下内容:
List(List(5), List(2), List(3, 3, 3), List(5, 5), List(3, 3), List(2, 2, 2))
我假设有一个简单的列表函数可以做到这一点,但我找不到它。
发布于 2011-01-22 01:21:55
这是我通常使用的技巧:
def split[T](list: List[T]) : List[List[T]] = list match {
case Nil => Nil
case h::t => val segment = list takeWhile {h ==}
segment :: split(list drop segment.length)
}
实际上..。事实并非如此,我通常会对集合类型进行抽象,也会使用尾递归进行优化,但我希望让答案保持简单。
发布于 2011-01-22 01:53:36
val xs = List(5, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
这里有另一种方法。
(List(xs.take(1)) /: xs.tail)((l,r) =>
if (l.head.head==r) (r :: l.head) :: l.tail else List(r) :: l
).reverseMap(_.reverse)
发布于 2011-01-22 05:53:50
可恶的雷克斯·科尔,写下了我想要的答案。由于有一些细微的风格差异,下面是我的观点:
list.tail.foldLeft(List(list take 1)) {
case (acc @ (lst @ hd :: _) :: tl, el) =>
if (el == hd) (el :: lst) :: tl
else (el :: Nil) :: acc
}
由于元素是相同的,所以我没有费心反转这些子列表。
https://stackoverflow.com/questions/4761386
复制相似问题