2013-02-11 62 views
9

在scala中是否有方法來獲取List或Seq的(單個)頭元素和列表的(集合)尾?我知道有從scala列表中獲取頭項目和尾項目

def splitAt(n: Int): (List[A], List[A]) 

我可以很容易地從元組的第一個列表中抓取單個項目。但是有沒有內置的方法基本上是這樣的?

def splitAtHead: (Option[A], List[A]) 

就像我說的,你可以很容易地連鎖splitAt返回正確的簽名,但我想一個內置的方法也許能夠節省中間元組。

編輯:

@ OM-NOM-NOM的答案是正確的,但是這就是爲什麼我不能用他的第二個版本。

List[S](s1, s2, s3, s4).sortBy { _.f (h) } match { 
    case hd :: tail => recurse(tail) 
} 

回答

24

您可以使用模式匹配:

val hd::tail = List(1,2,3,4,5) 
//hd: Int = 1 
//tail: List[Int] = List(2, 3, 4, 5) 

或者只。頭/ .tail方法:

val hd = foo.head 
// hd: Int = 1 
val hdOpt = foo.headOption 
// hd: Option[Int] = Some(1) 
val tl = foo.tail 
// tl: List[Int] = List(2, 3, 4) 
+0

啊,模式匹配,效果顯着。出於某種原因,我認爲'case hd :: tail'會失敗的單個元素列表。但我只是測試它,它運行良好。我會編輯我的問題,回答爲什麼我不能使用你的第二個版本。 – Falmarri 2013-02-11 00:15:57