Scala: итерация с доступом к нескольким элементам - PullRequest
0 голосов
/ 18 марта 2019

У меня есть итератор, который содержит все нужные мне данные в некотором порядке сортировки. Я хотел бы выполнить некоторые операции над каждым элементом данных, который учитывает предыдущий и последующий элемент в итераторе. То есть У меня есть функция, которая, учитывая n элементов, принимает аргументы f(iter(k-1), iter(k), iter(k+1)) для 0 < k < n-1.

Конечно, я не могу просто перебрать итератор, потому что у меня нет доступа к элементу k + 1, когда я вызываю функцию.

Я мог бы просто составить список и использовать индексирование, но это было бы не элегантно. Как в Scala можно получить доступ к этим значениям? Можно ли как-нибудь составить итератор с собой и смещением?

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Я бы посоветовал использовать метод скользящий для того, что вам нужно. Допустим, функция 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)
2 голосов
/ 18 марта 2019

Комментарий от @ygor верный.

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

Обратите внимание, что код не знает, какая из них является последней коллекцией из 3.Последний элемент в yourIterator никогда не будет current.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...