2016-04-08 140 views
1

假設我有3個長度不同的數組。不同尺寸的RxJava marge陣列

String[] array1 = new String{"1", "2", "3", "4"}; 
String[] array2 = new String{"1", "b", "c"}; 
String[] array3 = new String{"@", "#"}; 

我想合併他們得到以下結果:

{"1", "a", "@", "2", "b", "#", "3", "c", "4"} 

是否有可能與RxJava做到這一點?如果不是,你會建議什麼其他解決方案? P.S.數組不能以任何不同的長度。

+3

一個簡單的算法應該做的伎倆。在這個任務中我沒有看到任何可以從RxJava的功能中受益的任何東西。 – laune

回答

1

如果你真的想與RxJava要做到這一點,這裏是我會怎麼做:

public class RoundRobinCollector { 
    public static void main(String[] args) { 
     Observable<Object> o1 = Observable.just("1", "2", "3", "4"); 
     Observable<Object> o2 = Observable.just("a", "b", "c"); 
     Observable<Object> o3 = Observable.just("@", "#"); 

     Object tag = new Object(); 
     Observable<Object> otag = Observable.just(tag); 

     Observable<Object> p1 = o1.concatWith(otag.repeat()); 
     Observable<Object> p2 = o2.concatWith(otag.repeat()); 
     Observable<Object> p3 = o3.concatWith(otag.repeat()); 

     Observable.zip(p1, p2, p3, (a, b, c) -> { 
      List<Object> list = new ArrayList<>(); 
      if (a != tag) { 
       list.add(a); 
      } 
      if (b != tag) { 
       list.add(b); 
      } 
      if (c != tag) { 
       list.add(c); 
      } 
      return list; 
     }) 
     .takeWhile(list -> !list.isEmpty()) 
     .concatMapIterable(v -> v) 
     .toList() 
     .subscribe(System.out::println) 
     ; 
    } 
} 

鑑於原始來源可觀,我墊在他們年底成爲「無限」,因而有出現「長度相等」。我將它們壓縮並在函數中,我從那些沒有填充的列中準備一個列表。如果結束列表爲空,則takeWhile將完成序列。然後我用concatMapIterable將序列平坦化,將它收集到列表中並打印結果。

+0

非常感謝您的回答。用Rx做這件事似乎比用簡單的算法做起來要複雜得多。我只是覺得在Rx中可能有這樣一個功能。但是因爲我原來的問題與RxJava解決這個問題的方式有關,所以我接受這個答案是正確的。 – Andranik

0

通過答案akarnokd是正確的答案,如果你想解決RxJava這個問題,但我結束了一個簡單的算法,像勞瑞懶懶建議,與RxJava變得更加複雜,這是原因。我只是認爲RxJava可以具有某種功能,可以爲我做到這一點。所以這裏是我最後做的:

private List<Item> mergeItems(Response response){ 
     ArrayList<Item> mergedList = new ArrayList<>(); 

     final int eSize = response.getEvents().size(); 
     final int cSize = response.getCommunities().size(); 
     final int vSize = response.getVenues().size(); 

     final int maxSize = Math.max(eSize, Math.max(cSize, vSize)); 

     for (int i = 0; i < maxSize; i++){ 

      if(i < eSize){ 
       mergedList.add(response.getEvents().get(i)); 
      } 

      if(i < cSize){ 
       mergedList.add(response.getCommunities().get(i)); 
      } 

      if(i < vSize){ 
       mergedList.add(response.getVenues().get(i)); 
      } 
     } 

     return mergedList; 
    }