Scala:迭代,访问多个元素



我有一个迭代器,其中包含我需要以某种顺序的所有数据。我想对每个数据元素执行一些操作,以考虑迭代器中的前面和后续元素。IE。我的功能在n元素上为0 < k < n-1采用参数f(iter(k-1), iter(k), iter(k+1))

当然,我不能在迭代器上迭代,因为我调用函数时无法访问k 1元素。

我只能将整个事情投入列表并使用索引,但这是不高的。访问这些值的Scala方式是什么?我可以以某种方式与迭代器一起组成迭代器和偏移吗?

@ygor的评论正确。

yourIterator.sliding(3)
            .collect{ case Seq(prev, current, next) =>
              //proceed accordingly
            }

请注意,代码不知道哪个是最终收集-3。yourIterator中的最后一个元素永远不会是current

我将考虑使用方法滑动所需的东西。假设函数f返回与迭代元素类型相同的类型。以下方法sliding3Iter将提供来自提供的迭代器的3个元素的滑动窗口,以函数f作为参数:

def sliding3Iter[T](it: Iterator[T], f: (T, T, T) => T): Iterator[T] =
  it.sliding(3).
    collect{ case ls if ls.size == 3 => f(ls(0), ls(1), ls(2)) }

例如:

val f = (i: Int, j: Int, k: Int) => i + j + k
val it = (0 to 10).toIterator
sliding3Iter(it, f).toList
// res1: List[Int] = List(3, 6, 9, 12, 15, 18, 21, 24, 27)

最新更新