2017-01-03 50 views
0

假設我有兩個有序的雙打的可觀察物。我想把它們之間的區別看作是可觀察的。例如:如何創建兩個排序的observables之間的差異observable?

  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。

+0

您能否提供一張大理石圖表,顯示何時發出來源的值以及如何導致產生的可觀察值? – Enigmativity

+0

@Enigmativity我添加了一個大理石圖。 HTH –

+0

這是一個很好的大理石圖。你是怎麼做到的?我仍然無法弄清楚規則。你能解釋一下嗎? – Enigmativity

回答

2

這就是我如何在rxjava中做到這一點,這意味着兩個觀察對象具有相同的長度。

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); 
+0

你在這裏做兩個假設:1.觀察者具有相同的長度(我更新了問題以表明他們不是),並且; 2.其中一個觀測值不能超過另一個(它們以相同的速率前進)。 –

+0

在這兩種觀察結果完成之前,這種新方法是否需要阻塞? –

+0

@OmervanKloeten不,沒有阻塞,所有的操作員都在生產非阻塞的可觀測量。 –

1

我不覺得有什麼太大的RxJava做對稱差「實時」。主要是因爲您的初始假設(可觀察數據已排序)不能由泛型操作員進行,所以很少有人會幫助您。

但是,您可以嘗試通過從sequenceEqual獲取靈感來爲此目的編寫自定義運算符:它在內部逐步推進兩個發佈者之間執行平等比較,以便接近您想要執行的操作。