0

ソートされた double の 2 つのオブザーバブルがあるとします。それらの違いを観測可能なものとして取得したいと思います。例えば:

           1       2           4        
 left:   ──o───────o───────────o────/
           1    3  4   5
 right:  ──o────o──o───o───/
                   l2          r3   r5
 output: ──────────o───────────o────o─/

これに対する必須の実装は単純です。まだ到達していない側のアイテムのリストを保持し、反対側からアイテムを「放出」します。

RFP の世界では、これに対する標準的なアプローチは何ですか? 私は特にRxScalaを使用しています。

4

2 に答える 2

3

これは、rxjava で行う方法であり、2 つのオブザーバブルが同じ長さであることを暗示しています。

    Observable<Integer> obs1 = Observable.just(1, 2, 4, 6);
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5);

    obs1.zipWith(obs2, (integer, integer2) -> {
        if (!Objects.equals(integer, integer2)) {
            return Observable.just(integer).concatWith(Observable.just(integer2));
        } else {
            return Observable.empty();
        }
    })
      .flatMap(observable -> observable)
      .sorted()
      .forEach(System.out::println);

編集

別のアプローチは、コレクションを使用することです

    Observable<Integer> obs1 = Observable.just(1, 2, 4);
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5);


    obs1.mergeWith(obs2)
            .sorted()
            .reduce(new ArrayList<Integer>(), (integers, integer) -> {
                if (integers.contains(integer)) {
                    integers.remove(integer);
                } else {
                    integers.add(integer);
                }
                return integers;
            })
            .flatMapIterable(integers -> integers)
            .forEach(System.out::println);
于 2017-01-03T20:25:41.923 に答える
1

RxJavaには、その対称的な違いを「リアルタイムで」行うことはあまりないと思います...主に、最初の仮定(オブザーバブルがソートされている)をジェネリック演算子で作成できないため、それを支援するものはほとんどありません。

ただし、からインスピレーションを得て、その目的のためにカスタム オペレーターをコーディングすることもできますsequenceEqual。これは、2 つのパブリッシャー間で内部的に段階的に進んで等価比較を実行するため、目的に近いものになります。

于 2017-01-05T13:07:19.947 に答える