如何在Stream
中找到两个连续且相同的值并返回此“重复值”:
def succ: Stream[Int] => Int = str => ...
例如,Stream(1, 2, 4, 3, 5, 5, 2, 2)
将产生5
。
那怎么办?
答案 0 :(得分:2)
您可以混合使用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)
答案 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]
,并添加一些其他检查。