使用列表的整数之和

时间:2014-11-23 20:11:39

标签: scala

我一直在尝试完成这个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)
}

4 个答案:

答案 0 :(得分: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 :(得分: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)(_ + _)

sum上还有一个List方法与foldLeft完全相同。

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

答案 2 :(得分:0)

我最终尝试了这个,我认为是对的。根据建议

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

 f.foldLeft(0) { _ + _ }

答案 3 :(得分: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
}