scala - 根据值减少迭代器

标签 scala functional-programming

我有一个这样的迭代器:

Iterator(List(1, 2012), List(2, 2015), List(5, 2017), List(7, 2020))

我试图返回一个迭代器,但值略有变化。所有 5 的倍数的值必须添加到上一行。所以结果是:

Iterator(List(1, 2012), List(2, 4032), List(7, 2020))

我尝试过使用以下方法:

val a = Iterator(List(1, 2012), List(2, 2015), List(5, 2017), List(7, 2020))

val aTransformed = a.reduce((x,y) => if (y(0)%5 == 0) List(x(0),x(1)+y(1)) else x)

但它给了我最终值val aTransformed: List[Int] = List(1, 4029)

如何才能获得所需格式的迭代器?有没有一种方法可以只检查上一行/下一行而不将其全部折叠成一个最终值?

我知道这可以通过将迭代器转换为列表、遍历、变异并转换回迭代器来实现,但是有更优雅的解决方案吗?

编辑以澄清:

5的连续倍数将被整理为一个和

例如:

Iterator(List(1, 2012), List(2, 2015), List(5, 2017), List(10, 2025))

应该变成

Iterator(List(1, 2012), List(2, 6057))

最佳答案

由于我们无法直接从迭代器中获取最后一个元素,因此我们需要一个缓冲区来存储最后一个元素,计算后,我们检查缓冲区状态并将最终结果附加到它。

这里我附加一个空的 Iterator[List[Int]] 元素来简化检查步骤。

def convert(xs: Iterator[List[Int]]): Iterator[List[Int]] = {
      val res = (xs ++ Iterator(List[Int]())).foldLeft(Iterator[List[Int]](), List[Int]())((x, y)=> {
        if (y.nonEmpty && y(0) % 5 == 0) {
          if (x._2.nonEmpty) {
            (x._1, List(x._2(0), x._2(1) + y(1)))
          } else {
            (x._1, y)
          }
        } else {
          if (x._2.nonEmpty) {
            (x._1 ++ Iterator(x._2), y)
          } else {
            (x._1, y)
          }
        }
      })

      res._1
    }

测试

scala> val xs1 = Iterator(List(1, 2012), List(2, 2015), List(5, 2017), List(7, 2020))
val xs1: Iterator[List[Int]] = <iterator>

scala> val xs2 = Iterator(List(1, 2012), List(2, 2015), List(5, 2017), List(10, 2025))
val xs2: Iterator[List[Int]] = <iterator>

scala> convert(xs1)
val res44: Iterator[List[Int]] = <iterator>

scala> res44.toList
val res45: List[List[Int]] = List(List(1, 2012), List(2, 4032), List(7, 2020))


scala> convert(xs2)
val res47: Iterator[List[Int]] = <iterator>

scala> res47.toList
val res48: List[List[Int]] = List(List(1, 2012), List(2, 6057))

关于scala - 根据值减少迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71074199/

相关文章:

node.js - 带有 ramda 和 ramda-fantasy 的 Monadic IO

scala - 如何修复 scala-library.jar 中的错误

Scala Akka 流 : How to Pass Through a Seq

java - 如何对遗留 J2EE 应用程序进行单元测试

haskell - "monadic function"的正式定义

f# - "point free"风格在函数式编程中的优缺点是什么?

java - Java游戏框架中静态 Controller 和非静态 Controller 的区别

scala - StringOps 和 WrappedString 实例之间的相等性

haskell - 如何将附加参数传递给 Control.Monad.Reader 实例

language-agnostic - "lazy evaluation"和 "reactive programming"