我有一个迭代器,该迭代器以某种排序顺序包含了我需要的所有数据。我想对每个数据元素执行一些操作,并考虑到迭代器中的前一个元素和后一个元素。即我有一个函数,给定n个元素,为f(iter(k-1), iter(k), iter(k+1))
接受参数0 < k < n-1
。
当然,我不能只迭代迭代器,因为调用函数时我无法访问k + 1元素。
我可以将整个对象转换成一个列表并使用索引,但这是不雅的。 Scala访问这些值的方式是什么?我可以以某种方式将迭代器本身和偏移量组成吗?
答案 0 :(得分:2)
@ygor的评论正确。
yourIterator.sliding(3)
.collect{ case Seq(prev, current, next) =>
//proceed accordingly
}
请注意,代码不知道哪个是3的最终集合。 yourIterator
中的最后一个元素将永远不会是current
。
答案 1 :(得分:2)
我会考虑根据需要使用方法sliding。假设函数f
返回的类型与迭代器的元素类型相同。以下方法sliding3Iter
将提供3个元素的滑动窗口,从提供的Iterator到函数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)