2

给定一个整数序列,我想根据一组条件将它分成不同的组:

  • 条件可能会改变
  • 每个元素可以属于零个、一个或多个组。这意味着这些组可以相互重叠。

例如,下面的代码将序列拆分1..12为两组 2 和 3 的倍数:

    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>>在第二个 observable 中使用 hot。
  2. 如何按特定顺序组合拆分组,例如join
  3. 有没有更好的解决问题的方法?
4

1 回答 1

0

groupBy使用方面,正常模式是和flatMap结合使用:

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

话虽如此,您还提到源发出的项目可以出现在多个组中。用于flatMapgroupBy. 例如数字 6,您可能会是flatMap的第一个元素。Observable.just(Multiple(2, 6), Multiple(3, 6))groupByMultiple

希望这对您来说已经足够了。

于 2016-05-23T08:59:58.910 回答