如何在流中找到两个连续且相同的值?

时间:2018-07-07 20:51:36

标签: scala stream duplicates return scala-streams

如何在Stream中找到两个连续且相同的值并返回此“重复值”:

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

例如,Stream(1, 2, 4, 3, 5, 5, 2, 2)将产生5

那怎么办?

3 个答案:

答案 0 :(得分:2)

您可以混合使用Stream.slidingStream.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)

答案 1 :(得分:2)

用尾巴压缩流是这样做的另一种方法,它似乎可以处理单元素流。空流将被明确处理:

$.each(name_list, function (index, value) {
    $.each(value, function(ind, obj) {
       console.log(value[ind]);
    });
});

答案 2 :(得分:0)

使用简单递归怎么样?

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],并添加一些其他检查。