1

我正在寻找一种从有序列表中删除相等的前 N ​​个元素的好方法,例如

List(1,1,1,2,3,3)

应该返回

removeSame(list)  -> (1,1,1)

有没有一种很好的方法来做到这一点,而不是删除列表的头部,然后takeWhile在其余部分上使用,最后使用dropwhile?我可以想到简单的非功能性解决方案,但我想知道是否还存在任何功能性解决方案

4

3 回答 3

7

避免重复takeWhiledropWhile获得前缀和余数的功能方法是使用span,即

scala> val list = List(1,1,1,2,3,3)
list: List[Int] = List(1, 1, 1, 2, 3, 3)

scala> val (prefix, rest) = list span (_ == list.head)
prefix: List[Int] = List(1, 1, 1)
rest: List[Int] = List(2, 3, 3)
于 2013-05-03T10:59:31.427 回答
3

这是你要找的吗?

scala> val l = List(1,1,1,2,3,3)
l: List[Int] = List(1, 1, 1, 2, 3, 3)

scala> l.takeWhile(_ == l.head)
res6: List[Int] = List(1, 1, 1)

scala> val l = List()
l: List[Nothing] = List()

scala> l.takeWhile(_ == l.head)
res7: List[Nothing] = List()
于 2013-05-03T10:03:15.760 回答
0

不是最好的方法,但这也有效:

def removeSame(l: List) = if( !l.isEmpty) l.groupBy( x => x)(l.head) else List()
于 2013-05-03T13:13:37.957 回答