我有以一定速率发出值的代码:
let source = zip (
interval(150) ,
from ([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3])
) .subscribe(a=>console.log(a))
我想找到一个值-确定了N
个值之后(这意味着-N
个重复的相同值)。
例如,如果N=5
,那么我需要找到它第一次产生5个相同的值。 (并发出该值。)
问题:
如何检测N个相同的值并发出该值(并完成流)?
所以这里的期望值为3
,因为它是5个相同值的第一个序列:
答案 0 :(得分:5)
您可以使用StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
timestamp = jsonObject.getLong("time");
lastLoadedDate = new Date(timestamp);
} catch (JSONException e) {
//Handle the exception
}
}
}
,其中bufferCount(N, 1)
告诉1
在每次发射之后都要发射其缓冲区,这意味着它将发射bufferCount
个项目的数组。然后只需检查它们是否相同且完整即可。
N
实时演示:https://stackblitz.com/edit/rxjs6-demo-xzb5so?file=index.ts
答案 1 :(得分:1)
这有点丑陋,但这会起作用
from([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]).pipe(
scan((acc, cur) => {
if (cur !== acc.lastValue) {
acc.count = 0;
acc.lastValue = cur;
} else {
acc.count++;
acc.lastValue = cur;
if (acc.count >= acc.nValues) {
acc.found = true;
}
}
return acc;
},
{
count: 0,
lastValue: undefined,
nValues: 5,
found: false
}),
filter(result => result.found),
map(result => result.lastValue),
take(1)
).subscribe(console.log)