首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于对连续的相同元素进行分组的Scala列表函数

用于对连续的相同元素进行分组的Scala列表函数
EN

Stack Overflow用户
提问于 2011-01-22 00:45:17
回答 7查看 7.5K关注 0票数 16

例如,给定:

代码语言:javascript
复制
List(5, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)

我想了解以下内容:

代码语言:javascript
复制
List(List(5), List(2), List(3, 3, 3), List(5, 5), List(3, 3), List(2, 2, 2))

我假设有一个简单的列表函数可以做到这一点,但我找不到它。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-22 01:21:55

这是我通常使用的技巧:

代码语言:javascript
复制
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)
}

实际上..。事实并非如此,我通常会对集合类型进行抽象,也会使用尾递归进行优化,但我希望让答案保持简单。

票数 16
EN

Stack Overflow用户

发布于 2011-01-22 01:53:36

代码语言:javascript
复制
val xs = List(5, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)

这里有另一种方法。

代码语言:javascript
复制
(List(xs.take(1)) /: xs.tail)((l,r) =>
  if (l.head.head==r) (r :: l.head) :: l.tail else List(r) :: l
).reverseMap(_.reverse)
票数 8
EN

Stack Overflow用户

发布于 2011-01-22 05:53:50

可恶的雷克斯·科尔,写下了我想要的答案。由于有一些细微的风格差异,下面是我的观点:

代码语言:javascript
复制
list.tail.foldLeft(List(list take 1)) { 
    case (acc @ (lst @ hd :: _) :: tl, el) => 
        if (el == hd) (el :: lst) :: tl 
        else (el :: Nil) :: acc 
}

由于元素是相同的,所以我没有费心反转这些子列表。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4761386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档