2

一連の整数を指定して、一連の条件に基づいて異なるグループに分割したいと考えています。

  • 条件のセットは変更される場合があります
  • 各要素は、ゼロ、1 つ、または複数のグループに属することができます。つまり、これらのグループは互いに重複する可能性があります。

たとえば、次のコードは、シーケンス1..12を 2 と 3 の倍数の 2 つのグループに分割します。

    final Observable<Integer> divisors = Observable.just(2, 3, 4);
    Observable.range(1, 12)
            .flatMap(i -> divisors
                    .filter(divisor -> i % divisor == 0)
                    .map(divisor -> new Pair<>(divisor, i))
            )
            .groupBy(pair -> pair.fst)
            .subscribe(group -> group.subscribe(pair -> System.out.println("element: " + pair.snd + ", group: " + pair.fst), Throwable::printStackTrace));

出力:

element: 2, group: 2
element: 3, group: 3
element: 4, group: 2
element: 4, group: 4
element: 6, group: 2
element: 6, group: 3
element: 8, group: 2
element: 8, group: 4
element: 9, group: 3
element: 10, group: 2
element: 12, group: 2
element: 12, group: 3
element: 12, group: 4

私の質問は次のとおりです。

  1. 上記の例では、条件セットが 1 つしかないことに注意してくださいdivisors。後で更新するにはどうすればよいですか?変化する変数は、自然にホットなオブザーバブルと考えることができると思います。Observable<Observable<Integer>>しかし、この場合、 2番目のオブザーバブルでホットを使用する方法がわかりません。
  2. のように、分割されたグループを特定の順序で結合する方法はjoin?
  3. 問題のより良い解決策はありますか?
4

1 に答える 1

0

使用に関してはgroupBy、通常のパターンは flatMap と組み合わせることです。

o.groupBy(...)
 .flatMap(g -> g.whatever())

ソースから放出されたアイテムは複数のグループに表示される可能性があることにも言及しています。flatMapの前にそれを行うために使用しgroupByます。たとえば、数字の 6 をの最初の要素にflatMapすることができます。Observable.just(Multiple(2, 6), Multiple(3, 6))groupByMultiple

うまくいけば、これはあなたにとって十分なスタートです。

于 2016-05-23T08:59:58.910 に答える