Scala命令优先级队列始终具有最低编号作为头部,升序
发布时间:2020-12-16 18:45:09 所属栏目:安全 来源:网络整理
导读:我想获得一个代码示例,它可以完成优先级队列中项目的升序排序. 我想将Tuple2(Int,String)存储在优先级队列中,以便它按元组的第一个元素按升序排序. 如果我的优先级队列被称为pq,我调用pq.head我想得到数量最少的元组,同样调用pq.dequeue. scala val pq = sca
我想获得一个代码示例,它可以完成优先级队列中项目的升序排序.
我想将Tuple2(Int,String)存储在优先级队列中,以便它按元组的第一个元素按升序排序. scala> val pq = scala.collection.mutable.PriorityQueue[(Int,String)]() pq: scala.collection.mutable.PriorityQueue[(Int,String)] = PriorityQueue() scala> pq += Tuple2(8,"eight") res60: pq.type = PriorityQueue((8,eight)) scala> pq += Tuple2(4,"four") res61: pq.type = PriorityQueue((8,eight),(4,four)) scala> pq += Tuple2(7,"seven") res62: pq.type = PriorityQueue((8,four),(7,seven)) 如何在插入上面的第一个元素应用升序? 谢谢 解决方法
PriorityQueue.apply和PriorityQueue.empty都采用将用于对内容进行排序的隐式Ordering实例 – 根据该排序,head将是“最大”值.你得到了元组的默认值,这是元组元素的词典排序,这不是你想要的,因为它会使元组中头部的第一个元素最大.
有几种方法可以解决这个问题.最简单的方法就是在你的队列中调用.reverse,这将为你提供一个新的队列,它具有相同的内容但顺序相反,这意味着具有最低值的元组将是头部. 您还可以在创建队列时提供自己的顺序: import scala.collection.mutable.PriorityQueue val pq = PriorityQueue.empty[(Int,String)]( implicitly[Ordering[(Int,String)]].reverse ) 或者,如果您明确不希望查询第二个元素: val pq = PriorityQueue.empty[(Int,String)]( Ordering.by((_: (Int,String))._1).reverse ) 这可能比撤消队列更有效,但可能不足以担心,因此您应该选择您认为最优雅的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |