2017-09-19 10 views
0

Rxjavaの特定の条件に基づいてグループリストを作成しようとしています。rx javaでグループ化してリストを返す方法

は以下の私の応答である:

{ 
    "dates":[ 
     { 
     "date":18, 
     "value":"1" 
     }, 
     { 
     "date":18, 
     "value":"2" 
     }, 
     { 
     "date":18, 
     "value":"3" 
     }, 
     { 
     "date":19, 
     "value":"1" 
     }, 
     { 
     "date":19, 
     "value":"2" 
     }, 
     { 
     "date":19, 
     "value":"3" 
     }, 
     { 
     "date":19, 
     "value":"4" 
     } 
    ] 
} 

どのように値18 [値1、値2、値3、highestvalue = 3、lowestvalue = 1] 19 [値1、値2によって基、 Rxjavaを使用して

注:私はループを使用して作成できますが、応答はサーバーからフェッチされ、rx Java機能を使用して観測可能な考えが戻ってきているためです。

Anyhelpは本当に感謝します。

は シャンティ

答えて

3

group by機能に見て、ありがとうございます。ここで

は好奇心だ、誰のための例です:

class DateModel implements Comparable<DateModel>{ 
    Integer date; 
    Integer value; 

    public DateModel(int date, int value){ 
     this.date = date; 
     this.value = value; 
    } 

    @Override 
    public int compareTo(DateModel o) { 
     return value.compareTo(o.value); 
    } 
} 

そして、我々は、これらのモデルオブジェクトのリストを集約する必要がある場合:

// example list 
List<DateModel> dateList = Arrays.asList(
    new DateModel(18,1), 
    new DateModel(18,2), 
    new DateModel(18,3), 
    new DateModel(19,1), 
    new DateModel(19,2), 
    new DateModel(19,3), 
    new DateModel(19,4) 
); 

// the following observable will give you an emission for every grouping 
// for the example data above, you should get two emissions (group 18 and 19) 
Observable<PriorityQueue<DateModel>> observable = 
    Observable.from(dateList) 
    .groupBy(dateModel -> dateModel.date) 
    .flatMap(groups -> groups.collect(PriorityQueue::new, PriorityQueue::add)); 

PriorityQueueはのために使用される構造のほんの一例でした収集する。キューからポップすると、18-1,18-2,18-3など(あなたが尋ねた順序で)が得られます。 max &分の検索のみを目的として、別の構造を使用することができます。

-1

ありがとうございます。

私は以下のコードを使用して解決できました。

Map<String, List<Date>> grouped = dates.body().getDate() 
         .stream() 
         .collect(Collectors.groupingBy(x -> { 
          return x.getTime().getMday(); // we can use any logic here 
         })); 
+1

これはjava8のストリームを使用していないRxjavaの方法 – Raghunandan

+0

はいこれはストリームを使用しています。私は非同期操作を実行していないので、この方法を試しました。 –

0

これは簡単に以下のように取得できます動作します@ジョンの答えに触発さ

List<Date> list = Arrays.asList(new Date[]{ 
      new Date(18, 1), new Date(18, 2), new Date(18, 3), new Date(19, 1), new Date(19, 2) 
    }); 

    Observable 
      .fromArray(list) 
      .map(new Function<List<Date>, List<Date>>() { 
       @Override 
       public List<Date> apply(@NonNull List<Date> dates) throws Exception { 
        TreeMap<Integer, List<Date>> treeMap = new TreeMap<Integer, List<Date>>(); 
        for (Date date : dates) { 
         List<Date> storedDates = treeMap.get(date.date); 
         if (storedDates == null) { 
          storedDates = new ArrayList<Date>(); 
          treeMap.put(date.date, storedDates); 
         } 
         storedDates.add(date); 
        } 

        List<Date> result = new ArrayList<Date>(); 
        for (Integer integer : treeMap.keySet()) { 
         result.addAll(treeMap.get(integer)); 
        } 
        return result; 
       } 
      }); 
1

。 Rxjava2と出力の完全なデモコードを以下に示します。

----------------------byCollect 
[2017/11/16 20:42:43.548 CST][ 1 -       main] - flatMapSingle : : 1 
[2017/11/16 20:42:43.590 CST][ 1 -       main] - flatMapSingle : : 2 
[2017/11/16 20:42:43.591 CST][ 1 -       main] - flatMapSingle : : 0 
[2017/11/16 20:42:43.592 CST][ 1 -       main] - subscribe : onNext : {0=[3, 6, 9]} 
[2017/11/16 20:42:43.593 CST][ 1 -       main] - subscribe : onNext : {1=[1, 4, 7]} 
[2017/11/16 20:42:43.593 CST][ 1 -       main] - subscribe : onNext : {2=[2, 5, 8]} 
[2017/11/16 20:42:43.597 CST][ 1 -       main] - subscribe : onComplete : 
----------------------byParallelAndBlockingGet 
[2017/11/16 20:42:43.629 CST][ 13 -  RxComputationThreadPool-1] - flatMap : : 1 
[2017/11/16 20:42:43.629 CST][ 15 -  RxComputationThreadPool-3] - flatMap : : 0 
[2017/11/16 20:42:43.629 CST][ 14 -  RxComputationThreadPool-2] - flatMap : : 2 
[2017/11/16 20:42:43.632 CST][ 15 -  RxComputationThreadPool-3] - subscribe : onNext : {0=[3, 6, 9]} 
[2017/11/16 20:42:43.632 CST][ 15 -  RxComputationThreadPool-3] - subscribe : onNext : {1=[1, 4, 7]} 
[2017/11/16 20:42:43.633 CST][ 15 -  RxComputationThreadPool-3] - subscribe : onNext : {2=[2, 5, 8]} 
[2017/11/16 20:42:43.633 CST][ 15 -  RxComputationThreadPool-3] - subscribe : onComplete : 

源:Demo.java

出力用Observable

  • + Single#blockingGet()ため

  • 関連する問題