我有一个迭代器,其中包含我需要以某种顺序的所有数据。我想对每个数据元素执行一些操作,以考虑迭代器中的前面和后续元素。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)