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