2014-11-23 35 views
-1

我一直在試圖完成這個使用列表輸出列表中所有正整數的總和的scala代碼..我得到它的工作,除了它只適用於正數。但我不能讓它只輸出正數。我有兩個版本,一直試圖去工作,我想也許這將是更容易的機智案件,但我最終遇到了同樣的問題。我一直在嘗試如果聲明xs < 0,但那些不起作用,我不能讓過濾器與摺疊工作。有關如何處理這個問題的任何建議?使用列表的整數求和

def sum(xs: List[Int]): Int = { 

xs.filter((x: Int) => x > 0) 

xs.foldLeft(0) { _ + _ } 

} 

def sum2(xs: List[Int]): Int = xs match { 

case Nil => 0 
case y :: ys => y + sum(ys) 
} 
+1

您的問題是xs.filter不修改XS但返回新的名單。所以你想鏈接它xs.filter(...)。foldLeft(...) – 2014-11-23 23:29:46

回答

0

您的第一個版本幾乎是正確的。請記住,過濾方法沒有副作用,所以只是試試這個小的變化:

def sum(xs: List[Int]): Int = {  
    xs.filter((x: Int) => x > 0).foldLeft(0) { _ + _ }  
} 

或者簡單的版本:

def sum(xs: List[Int]): Int = { 
    xs.filter(_ > 0).sum 
} 
1
List(1, -2, 3).filter(_ > 0).sum // 4 

或在單次

List(1, -2, 3).foldLeft(0){(acc, i) => if (i > 0) acc + i else acc } //4 
1

xs是一個不可變List[Int],這意味着你是只是修改同一xs值並將其返回。

def sum(xs: List[Int]): Int = { 
    xs.filter((x: Int) => x > 0) // This is a pure expression and effectively does nothing 
    xs.foldLeft(0) { _ + _ }  // This is the value that is returned, modifying the *original* `xs` parameter 
} 

你需要做的是鏈接在一起的功能,以相同的價值操作。

def sum(xs: List[Int]): Int = { 
    xs.filter((x: Int) => x > 0).foldLeft(0) { _ + _ } 
} 

類型檢查是沒有必要在這裏,所以它可以短:

def sum(xs: List[Int]): Int = xs.filter(_ > 0).foldLeft(0)(_ + _) 

還有上List一個sum方法做同樣的事情作爲你的foldLeft

def sum(xs: List[Int]): Int = xs.filter(_ > 0).sum 
0

我結束了嘗試這個,我認爲是正確的。根據建議

val f = xs.filter((x: Int) => x > 0) 

f.foldLeft(0) { _ + _ }