簡體   English   中英

如何在 Monix 中全局訂購多個有序的 observable

[英]How to globally order multiple ordered observables in Monix

假設我有多個有序的迭代器。 如果我想合並這些迭代器,同時使用monix對它們進行全局排序(例如[(1,3,4), (2,4,5)] -> [1,2,3,4,4,5] )我做嗎?

不使用 Monix,但我不確定這是否相關

import scala.collection.BufferedIterator


def merge[A:Ordering](xs: Seq[Iterator[A]]) = 
  new Iterator[A] {
    val its = xs.map(_.buffered)
    def hasNext = its.exists(_.hasNext)
    def next = its.filter{ _.hasNext}
                  .minBy(_.head)
                  .next
  }


val ys = merge(Seq(List(1,3,5).toIterator, List(2,4,6).toIterator, List(10,11).toIterator))

ys.toList  //> res0: List[Int] = List(1, 2, 3, 4, 5, 6, 10, 11)

由於 observable 是一個項目流,它可以概括為兩種類型:

  • 有限流
  • 無限流

請注意,為了正確排序,您需要所有項目。 因此,沒有簡單的方法可以做到這一點。

對於有限流,您必須累積所有項目,然后進行排序。 您可以使用Observable.fromIterable將其轉回可Observable.fromIterable

val items = List((1,3,4), (2,4,5))

val sortedList = Observable
  .fromIterable(items)
  .flatMap(item => Observable.fromIterable(List(item._1, item._2, item._3)))
  .toListL // Flatten to an Observable[Int]
  .map(_.sorted) 

對於無限流,您唯一可以做的就是將項目緩沖到特定時間或大小。 我看不到任何方法,因為您不知道流何時結束。

例如,

val itemsStream: Observable[(Int, Int, Int)] = ???

itemsStream
  .bufferIntrospective(10)
  .flatMap((itemList: List[(Int, Int, Int)]) => // You'll have to sort this
     ???
  )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM