2015-10-22 19 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! –