2014-11-23 10 views
-1

Я пытался завершить этот scala-код, который использует список для вывода суммирования всех положительных целых чисел в списке. Я получил его работу, за исключением того, что он работает только для положительных чисел. но я не могу заставить его выводить только положительные числа. У меня есть две версии, которые ive пытались приступить к работе, я подумал, что, возможно, это будет проще, но я столкнулся с той же проблемой. Я пытаюсь использовать инструкции с 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.filter (...). FoldLeft (...) –

ответ

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)(_ + _) 

Существует также метод sum на List, который делает то же самое, как ваш foldLeft.

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

Я в конечном итоге пытался это, что я считаю правильным. на основе предложений

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

f.foldLeft(0) { _ + _ } 
Смежные вопросы