jac*_*rdy 6 sorting algorithm scala
我有一个我想要排序的对象数组,其中排序的谓词是异步的.Scala是否具有标准或第三方库函数,用于基于具有类型签名(T, T) -> Future[Bool]而不仅仅是的谓词进行排序(T, T) -> Bool?
或者,是否有其他方法可以构建此代码?我已经考虑过查找列表元素的所有2对排列,在每对上运行谓词并将结果存储在一个Map((T, T), Bool)或一些结构中,然后对其进行排序 - 但我怀疑会执行更多的比较甚至比天真的排序算法还要好.
如果您的谓词是异步的,您可能更喜欢获得异步结果,并避免使用阻塞线程Await
如果你想List[(T,T)]根据未来的布尔谓词对 a 进行排序,最简单的方法是对 a 进行排序List[(T,T,Boolean)]
因此,给定 a 你有 aList[(T,T)]和谓词(T, T) -> Future[Bool],你如何得到 a List[(T,T,Boolean)]?或者更确切地说,Future[List[(T,T,Boolean)]]因为您想保留异步行为。
val list: List[(T,T)] = ...
val predicate = ...
val listOfFutures: List[Future[(T,T,Boolean]] = list.map { tuple2 =>
predicate(tuple2).map( bool => (tuple2._1, tuple2._2, bool)
}
val futureList: Future[List[(T,T,Boolean)]] = Future.sequence(listOfFutures)
val futureSortedResult: Future[List[(T,T)]] = futureList.map { list =>
list.sort(_._3).map(tuple3 => (tuple3._1,tuple3._2))
}
Run Code Online (Sandbox Code Playgroud)
这是伪代码,我没有编译它,也可能不会,但你明白了。
关键是Future.sequence,非常有用,它以某种方式允许转换Monad1[Monad2[X]]为,Monad2[Monad1[X]]但请注意,如果您的任何谓词未来失败,全局排序操作也将失败。
如果您想要更好的性能,“批量”调用返回Future[Boolean]. 例如,(T, T) -> Future[Bool]您可以设计一个服务(如果您显然拥有它),这样List[(T, T)] -> Future[List[(T,T,Bool)]您就可以在异步单个调用中获得所需的一切。