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