2016-02-05 73 views
0

例如我有以下Scala列表,我想要一個子列表,直到有一個需求可以被滿足。斯卡拉集合選擇元素,直到第一個滿足要求

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

的要求是數爲5個,所以我想要的結果爲:

Seq(1,2,3,4) 

目前我使用Scala的集合的indexWheresplitAt返回:

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

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

我不是肯定有更好的方法來實現更好的斯卡拉收集的方法,我沒有意識到?

+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

雖然榆樹的回答是有效的,但我相信Ende的'List#takeWhile'應該是被接受的答案,因爲簡單。由於OP只需要elm中的'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

相關問題