Scala:通过访问多个元素进行迭代

时间:2019-03-18 04:56:51

标签: scala iterator

我有一个迭代器,该迭代器以某种排序顺序包含了我需要的所有数据。我想对每个数据元素执行一些操作,并考虑到迭代器中的前一个元素和后一个元素。即我有一个函数,给定n个元素,为f(iter(k-1), iter(k), iter(k+1))接受参数0 < k < n-1

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

我可以将整个对象转换成一个列表并使用索引,但这是不雅的。 Scala访问这些值的方式是什么?我可以以某种方式将迭代器本身和偏移量组成吗?

2 个答案:

答案 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)