如何在流中找到两个连续且相同的值?
How to find two successive and same values in a Stream?
如何在 Stream
和 return 中找到两个连续且相同的值 "duplicate-value":
def succ: Stream[Int] => Int = str => ...
例如 Stream(1, 2, 4, 3, 5, 5, 2, 2)
将导致 5
。
如何做到这一点?
您可以混合使用 Stream.sliding
and 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
如果没有连续的元素共享相同的值。
根据您的评论,为了 return 0
而不是 None
当没有连续元素共享相同的值时,您可以在最后应用 .getOrElse(0)
管道数:
def succ(stream: Stream[Int]): Int =
stream.sliding(2).collectFirst { case Stream(x, y) if x == y => x }.getOrElse(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)
}
如果没有找到后续重复项,这将不起作用,因为您必须将 return 类型更改为 Option[Int]
并添加一些额外的检查。
用尾巴压缩流是另一种方法,它似乎可以处理单个元素流。明确处理空流:
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)
}
如何在 Stream
和 return 中找到两个连续且相同的值 "duplicate-value":
def succ: Stream[Int] => Int = str => ...
例如 Stream(1, 2, 4, 3, 5, 5, 2, 2)
将导致 5
。
如何做到这一点?
您可以混合使用 Stream.sliding
and 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
如果没有连续的元素共享相同的值。
根据您的评论,为了 return 0
而不是 None
当没有连续元素共享相同的值时,您可以在最后应用 .getOrElse(0)
管道数:
def succ(stream: Stream[Int]): Int =
stream.sliding(2).collectFirst { case Stream(x, y) if x == y => x }.getOrElse(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)
}
如果没有找到后续重复项,这将不起作用,因为您必须将 return 类型更改为 Option[Int]
并添加一些额外的检查。
用尾巴压缩流是另一种方法,它似乎可以处理单个元素流。明确处理空流:
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)
}