我是ReactiveX的相对新手,并且分别从序列的开头和结尾了解Rx.Observable.take
和Rx.Observable.takeLast
,并Rx.Observable.windowWithCount
从原始片段中获取可能重叠的窗口观察到的。为了好玩,我想完全使用反应式算子和传感器编写FFT算法。一些算法对于端口来说是直观的,但有些算法很难用流建模。具体来说,rfft作用于序列的开始和结束值,我无法弄清楚该怎么做。更具体地说,如果我有:
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
它将被分解为可观察的窗口:
[[0,1,14,15],[2,3,12,13],[4,5,10,11],[6,7,8,9]]
对于任意可观察的序列,是否有一种优雅的方法可以做到这一点?
答案 0 :(得分:0)
我不得不说,我不认为使用有限流的反应是一个好主意,因为你没有任何反应或任何反压的事件。你必须知道流的长度和有限的。最好的解决方案是使用带有o(1)的数组。然而,这是一个可能的解决方案,它将使用许多cpu周期。我使用RxJava2-RC5进行测试。
@Test
public void ttfAlgo() throws Exception {
Observable<Integer> ascendingOrdered = Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.concatWith(Observable.just(11, 12, 13, 14, 15));
Observable<Integer> descendingOrdered = ascendingOrdered.sorted((t1, t2) -> {
return t2.compareTo(t1);
});
Observable.zip(ascendingOrdered.window(2), descendingOrdered.window(2), (w1, w2) -> {
return w1.concatWith(w2.sorted());
}).flatMap(window -> {
System.out.println("windowX");
return window;
}).subscribe(integer -> {
System.out.println(integer);
});
Thread.sleep(1_000);
}