问题 RxJava中的笛卡尔积


是否有可能在rxjava中获得两个Observable的笛卡尔积?

像这样的东西:

A -> 1,2,3
B -> a,b
A x B -> (1, a), (1, b), (2, a), (2, b), (3, a), (3, b)

1035
2018-03-31 14:27


起源

所以当c到达B然后A x B产生“c乘以到达A的元素到目前为止”? - jhegedus
@jhegedus对 - nmikhailov
我的直觉(基于Reactive课程)是有可能的,但这只是一种感觉:)对不起,我的RX有点生疏。 - jhegedus
第4周的材料可能有答案 coursera.org/course/reactive - jhegedus


答案:


你想要的是为一个数字生成一对,就像你有字母一样。 所以你可以轻松地使用它 map 和 flatMap 运营商。

    Observable<Integer> number = Observable.from(Arrays.asList(1, 2, 3));
    Observable<String> letters = Observable.from(Arrays.asList("a", "b"));

    Observable<Pair> cartesian = number.flatMap((n) -> letters.map((l) -> new Pair(n, l)));

12
2017-10-27 13:37



Thanx David,我偶然发现了这个需求;)但这是第一个版本,我需要一个版本来计算可变大小的Observables列表的笛卡尔积。棘手。 - Cédric Vidal
您可以采用这种方法并在for循环中不断添加flatMap()。 - tmn
fun main(args:Array <String>){val sources = listOf(Observable.just(1,2,3,4,5),Observable.just(10,20,30,40,50),Observable.just( 100,200,300,400,500))var cartesianProduct:Observable <List <Int >>? = null for(obs in sources){if(cartesianProduct == null){cartesianProduct = obs.map {listOf(it)}} else {cartesianProduct = cartesianProduct.flatMap {list - > obs.map {list.plus(it) CartesianProduct !!。subscribe(:: println)} - tmn


“加入”不是你想要的吗?

    Observable<Integer> a = Observable.fromArray(1, 2, 3);
    Observable<String>  b = Observable.fromArray("a", "b");

    Observable<?> left  = Observable.never();
    Observable<?> right = Observable.never();

    Observable<Pair<Integer, String>> pairs = a.join(b, (aa)->left, (bb)->right, (ai, bi)-> Pair.of(ai, bi));

0
2018-05-25 12:36





这是笛卡尔映射的伪。

A  ->  Pair<A,"letter">  ->  C
B  ->  Pair<B,"number">  ->  D

Merge(C,D) -> lift(new CartesianOperator) -> Result  

笛卡尔运算符将存储数字列表和字符列表。

如果引入了唯一字符。您可以为唯一字符的每个组合与记录的数字列表生成响应。然后将您的唯一字符添加到章程列表中,然后重复该过程。

您对唯一数字也这样做。

最后,你将能够发送类似1,1,2,3和a,b,b的东西,并收到类似(a,1)(a,2)(a,3)(b,1)的内容(b,2)(b,3)

编辑:

因此,这是一个快速的,无可否认的不可扩展的实现,可以工作。它需要一对物体。

值1是你的'a','b','1','2'或'3',和 值2是您的类型'('数字'或'字符')

它返回映射到数字的可观察字符对。

public class CartesianOperator implements Observable.Operator<Pair<String,String>,Pair<String,String>> {


@Override
public Subscriber<? super Pair<String, String>> call(final Subscriber<? super     Pair<String, String>> subscriber) {
return new Subscriber<Pair<String, String>>() {
  List<String> numbers;
  List<String> characters;
  @Override
  public void onCompleted() {

  }

  @Override
  public void onError(Throwable e) {

  }

  @Override
  public void onNext(Pair<String, String> stringStringPair) {

    if(stringStringPair.second == "number")
    {
      if(numbers.size() == 0)
      {
        numbers.add(stringStringPair.first);
      }
      else
      {
        if(numbers.contains(stringStringPair.first))
        {}
        else
        {
          for(String temp: characters)
          {
            //Return Every permutation of existing characters with new number
            subscriber.onNext( new Pair<String,String>(temp,stringStringPair.first));
          }
        }

      }
    }
    else // Assume vallue is a character
    {
      if(characters.size() == 0)
      {
        characters.add(stringStringPair.first);
      }
      else
      {
        if(characters.contains(stringStringPair.first))
        {}
        else
        {
          for(String temp: numbers)
          {
            //Return Every permutation of existing numbers with new character
            subscriber.onNext( new Pair<String,String>(stringStringPair.first,temp));
          }
        }
      } 
    }
  }
};
}
}

如果您不知道对象是什么,它本质上是一个封装其他两个对象的对象。

pairObject.first  

返回我的对的第一个对象

pairObject.second

返回我的对的第二个对象

我认为它现在已被弃用了。


-1
2017-08-06 19:54