2013-05-03 5 views
1

Я ищу хороший способ удалить первые N элементов, которые равны из упорядоченного списка, например.Scala - выбор элементов из упорядоченного списка

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

должен вернуть

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

Есть хороший способ сделать это, а не удалить голову списка, а затем использовать takeWhile на остаток, и, наконец, с помощью dropwhile? Я могу думать о простом нефункциональном решении, но мне было интересно, существует ли какой-либо функциональный

ответ

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) 
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() 
+0

SOrry, не могли бы вы изменить его, чтобы иметь дело с «Итератором», а не с списком? благодаря – Bober02

0

Не самый лучший способ сделать это, но это также работает:

def removeSame(l: List) = if(!l.isEmpty) l.groupBy(x => x)(l.head) else List() 
Смежные вопросы