Как найти два последовательных и одинаковых значения в потоке?

appcodix спросил: 13 июня 2018 в 07:11 в: scala

Как найти два последовательных и одинаковых значения в Stream и вернуть это "дублирующее значение":

def succ: Stream[Int] => Int = str => ...

Например, Stream(1, 2, 4, 3, 5, 5, 2, 2) приведет к 5.

Как это сделать?

3 ответа

Есть решение
Xavier Guihot Jack Leow ответил: 17 июня 2018 в 03:51

Закручивание потока хвостом - это еще один способ сделать это, который, по-видимому, обрабатывает отдельные потоки элементов. Пустые потоки обрабатываются явно:

def succ: Stream[Int] => Int = {
  case Stream() => 0
  case str =>
    str.zip(str.tail).
    find { case (l, r) => l == r }.
    map { case (x, _) => x }.
    getOrElse(0)
}
Xavier Guihot ответил: 17 июня 2018 в 04:03

Вы можете использовать сочетание Stream.sliding и Stream.collectFirst:

def succ(stream: Stream[Int]): Option[Int] =
  stream.sliding(2).collectFirst { case Stream(x, y) if x == y => x }

, которое производит:

Stream(1, 2, 4, 3, 5, 5, 2, 2)
  .sliding(2) // Stream(Stream(1, 2), Stream(2, 4), Stream(4, 3), ...
  .collectFirst { case Stream(x, y) if x == y => x } // Some(5)

или None, если ни один из последовательных элементов не имеет одинакового значения.


В соответствии с вашим комментарием, чтобы вернуть 0 None, когда ни один из последовательных элементов не имеет одинаковое значение, вы можете применить .getOrElse(0) в конце конвейера:

def succ(stream: Stream[Int]): Int =
  stream.sliding(2).collectFirst { case Stream(x, y) if x == y => x }.getOrElse(0)
appcodix ответил: 13 июня 2018 в 07:28
Если нет последовательных значений, оно возвращает 0. f есть такое значение, которое оно должно возвращать напрямую.
Dennis Hunziker ответил: 13 июня 2018 в 07:28

Как насчет использования простой рекурсии?

def succ: Stream[Int] => Int = {
  def rec(x: Int, xs: Stream[Int]): Int = {
    if (x == xs.head) x
    else rec(xs.head, xs.tail)
  }  (str: Stream[Int]) => rec(str.head, str.tail)
}

Это не работает, если не найдены последующие дубликаты, для этого вам нужно будет изменить тип возвращаемого значения на Option[Int] и добавьте дополнительные проверки.

Дополнительное видео по вопросу: Как найти два последовательных и одинаковых значения в потоке?

Biblical Series I: Introduction to the Idea of God

SCP-093 Red Sea Object | Euclid class | portal / extradimensional / artifact / stone scp

Live Production and Broadcast Update