Как уменьшить положительные элементы в коллекции в scala? - PullRequest
1 голос
/ 03 апреля 2020

Учитывая целые числа массива:

-2,1,-3,4,6,-1,2,1,1,-5,4

Я хочу преобразовать этот массив в другой массив:

-2,1,-3,10,-1,4,-5,4

Может Добавить условие в функцию приведения?

Что-то в этом роде:

...
val nums = Array(-2,1,-3,4,6,-1,2,1,1,-5,4)
val reduced = nums.reduce((x, y) => {
    if (x > 0 && y > 0){
        x + y
    }
})

...

Ответы [ 4 ]

1 голос
/ 03 апреля 2020
scala> val nums = Array(-2,1,-3,4,6,-1,2,1,1,-5,4)
nums: Array[Int] = Array(-2, 1, -3, 4, 6, -1, 2, 1, 1, -5, 4)

scala> nums.foldLeft(List[Int]()){ 
         case (init :+ last, num) if last > 0 && num > 0 => init :+ (last + num)
         case (res, num) => res :+ num 
       }
res0: List[Int] = List(-2, 1, -3, 10, -1, 4, -5, 4)

Или:

scala> def reduce(nums: Seq[Int]): Seq[Int] = nums match {
     |   case x1+:x2+:xs => if(x1>0 && x2>0) reduce((x1+x2)+:xs) else x1+:reduce(x2+:xs)
     |   case ns => ns
     | }
def reduce(nums: Seq[Int]): Seq[Int]

scala> reduce(nums)
val res1: Seq[Int] = ArraySeq(-2, 1, -3, 10, -1, 4, -5, 4)
0 голосов
/ 03 апреля 2020

Простой, нехвостый рекурсивный:

def reducePositives(l: List[Int]): List[Int] = {
  l.span(_ > 0) match {
    case (Nil, Nil) => Nil
    case (Nil, np :: rest) => np :: reducePositives(rest)
    case (p, rest) => p.sum :: reducePositives(rest)
  }
}
0 голосов
/ 03 апреля 2020

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

Однако вы можете написать простую рекурсивную функцию, которая делает то, что вы хотите (она использует список и сопоставление с шаблоном):

def sumPositives(arr: Array[Integer]): Array[Integer] = {
    @scala.annotation.tailrec
    def rec(list: List[Integer], acc: List[Integer]): List[Integer] = list match{
      case x :: y :: rest if x >= 0 && y >= 0 => rec(x+y :: rest, acc)
      case x :: y :: rest => rec(y :: rest, x :: acc)
      case x :: Nil => (x :: acc).reverse
      case Nil =>acc.reverse
    }

    rec(arr.toList, List()).toArray
  }

Конечно, это можно упростить, используя список в качестве входных данных вместо массива, но в своем вопросе вы специально упомянули массив.

0 голосов
/ 03 апреля 2020

Вы можете попробовать следующее:

val result = Array(-2,1,-3,4,6,-1,2,1,1,-5,4).foldLeft(ListBuffer.empty[Int]) {
  case (result, item) if item < 0 => result :+ item
  case (result, item) if item > 0 => result.lastOption.filter(_ > 0).fold(result :+ item) { positiveSum =>
    result.update(result.size -1, positiveSum + item)
    result
  }
}

println(result)

, что даст желаемый результат: (-2, 1, -3, 10, -1, 4, -5, 4) Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...