2016-07-03 52 views
0

謂語dropFirst takeFirst項目我有這些元素在列表中如何根據階

val list = (1,2,3,0, 0)

我需要這個名單分成兩個列表洗牌。

val list1 = (1) 
val list2 = (2, 3, 0, 0) 

第一個列表包含一個項目是不是0,第二個列表包含項目的其餘部分。

修復下面的代碼,所以list1 never contains 0list1 :: list2 == list

val list = (1, 2, 0, 3, 0).shuffle 

val list1 = list(0) 
val list2 = list drop 1 

有點類似於此:How should I remove the first occurrence of an object from a list in Scala?

+0

如果列表洗牌,我不知道第二個要求可以舉行。假設順序是(0,1,2,3,0),第一個列表應該包含(1),但是連接它們會給我們(1,0,2,3,0)。第二個要求是否可以放寬,使得'list1 :: list2'具有相同的成員並且計數爲'list',但不是相同的順序? –

+0

訂單無所謂@ MichaelBar-Sinai – user3995789

+1

您已經嘗試了哪些解決方案? – Dima

回答

2

我會從以下功能開始:

def sep(l: List[Int]) = 
    (l.find(_ != 0).toList, 
    l.takeWhile(_ == 0) ::: l.dropWhile(_ == 0).tail) 

它返回你所需要的,如果解決方案存在:

sep(List(0, 1, 0, 2, 3)) -> (List(1),List(0, 0, 2, 3)) 
sep(List(1, 4, 0, 2, 3)) -> (List(1),List(4, 0, 2, 3)) 
sep(List(0, 0, 4, 5)) -> (List(4),List(0, 0, 5)) 

但是,如果您有List(0,0) ...下一步是遞歸編寫它,因此它只使用一次迭代。

0

許多這樣做的方法,這裏是我的:

val list = List(0,1,0,3,2) 
val list1 = List(list.find(_!=0).get) 
val list2 = list.filter(_!=list1(0)) 

最終結果(斯卡拉REPL)

list: List[Int] = List(0, 1, 0, 3, 2) 
list1: List[Int] = List(1) 
list2: List[Int] = List(0, 0, 3, 2) 

請注意,此代碼假定list具有在列表中的一個非零成員。

更新(每@ theArchetypalPaul此言)支持列表與非唯一非零成員:

val temp = list.span(_ == 0) 
val list1 = List(temp._2.head) 
val list2 = temp._1 ++ temp._2.tail 
+2

'0,1,0,1,0'失敗(或者'find'返回的非零元素在列表中再次重複的任何列表) –

+0

謝謝。我已經更新了答案。基於這個問題,我假定輸入列表中的所有非零成員都是唯一的。 –

+0

如果他們都爲零,則失敗:) –