2016-02-05 2 views
0

Например, у меня есть список Scala, я хочу получить подсписку, пока не будет выполнено требование.Элементы коллекции Scala выбирают до тех пор, пока первый не встретит требование

val list = Seq(1,2,3,4,5,5,4,1,2,5) 

Требование является число 5, поэтому я хочу, результат, как:

Seq(1,2,3,4) 

В настоящее время я использую Scala коллекции indexWhere и splitAt вернуться:

list.splitAt(list.indexWhere(x => x == 5)) 

(Seq(1,2,3,4), Seq(5,5,4,1,2,5)) 

Я не Конечно, есть более лучшие способы добиться того же самого лучшего метода коллекции Scala, которого я не понимал?

+2

Я не пытаюсь быть забавным, но вы пробовали прочитать документацию? Первое, что я делаю, когда думаю, что может быть стандартный метод для чего-то, - это сканировать список методов (в этом случае) Seq, и это быстро привело бы вас к 'span' и' takeWhile' ('takeWhile' ' в данном случае это особенно остроумно). См. Http://www.scala-lang.org/api/current/index.html#[email protected](p:A=>Boolean):Repr –

ответ

2

Используйте span как это,

val (l,r) = list.span(_ != 5) 

который поставляет

l: List(1, 2, 3, 4) 
r: List(5, 5, 4, 1, 2, 5) 

В качестве альтернативы, вы можете написать

val l = list.span(_ != 5)._1 

для доступа только к первому элементу полученного кортежа.

Это делит пополам список в первом элементе, который не содержит условия.

+1

Несмотря на то, что ответ elm действителен, я считаю, что «List # takeWhile' от Ende должен быть принятым ответом из-за простоты. Поскольку OP хочет только «l» в вязах, я бы сказал, что представленный ответ Ende проще. –

+0

@ KevinMeredith, напротив, пример выборки OP показывает как список до 5, так и оставшуюся часть списка. –

+0

Напротив вашего противоречия :), OP сказал: «Требование - это число 5, поэтому я хочу, чтобы результат был следующим: « Seq (1,2,3,4) »' –

5

Вы можете использовать takeWhile:

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

scala> list.takeWhile(_ != 5) 
res30: Seq[Int] = List(1, 2, 3, 4) 
+0

О, круто. takeWhile и dropWhile. – ttt

Смежные вопросы