我正在寻找一种从有序列表中删除相等的前 N 个元素的好方法,例如
List(1,1,1,2,3,3)
应该返回
removeSame(list) -> (1,1,1)
有没有一种很好的方法来做到这一点,而不是删除列表的头部,然后takeWhile
在其余部分上使用,最后使用dropwhile
?我可以想到简单的非功能性解决方案,但我想知道是否还存在任何功能性解决方案
避免重复takeWhile
并dropWhile
获得前缀和余数的功能方法是使用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)
这是你要找的吗?
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()
不是最好的方法,但这也有效:
def removeSame(l: List) = if( !l.isEmpty) l.groupBy( x => x)(l.head) else List()