2015-10-22 20 views
3

我有號碼的列表斯卡拉 - 映射函數來替換與先前數底片在列表

[1,2,3,-1000,4,-1000]

我想寫一個地圖功能與之前的數(前負)

在這種情況下,以取代在我的列表中的所有負數輸出將是

[1,2,3,3,4,4]

寫這個map函數的最好方法是什麼?

+0

如果第一個數字是負數應該發生什麼? – Lee

+0

首先數目將不會被負 – ZhongBot

+0

另外注意,可以是連續的底片 [1,-1000,-1000] 變爲 [1,1,1] – ZhongBot

回答

4
yourList.foldLeft(List[Int]()) { (acc, i) => if (i >= 0) i :: acc else acc.head :: acc }.reverse 

如果第一個數字是負數,將會拋出異常。

感謝Aivean。

+1

注意您的方法將需要O(N^2)的時候,因爲將元素添加到列表的末尾(以及獲取最後一個元素)需要O(N)作爲「List」。 – Aivean

+0

公平點。更正 –

+1

此外,你正在取代零與負面。 – Aivean

1
def replaceNegatives(list: List[Int], prev: Int = 0): List[Int] = { 
    list match { 
    case Nil => Nil 
    case (x :: xs) if x < 0 => prev :: replaceNegatives(xs, prev) 
    case x :: xs => x :: replaceNegatives(xs, x) 
    } 
} 

實施例:

scala> replaceNegatives(List(1, 2, 3, -1000, 4, -1000)) 
res1: List[Int] = List(1, 2, 3, 3, 4, 4) 

的第二個參數(prev)是可選的;如果列表中的第一個項目是負數,則它是默認值。

+1

你的方法不是尾遞歸的,所以它在大輸入時會失敗。 – Aivean

+1

當心Aivean! –