加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala命令优先级队列始终具有最低编号作为头部,升序

发布时间:2020-12-16 18:45:09 所属栏目:安全 来源:网络整理
导读:我想获得一个代码示例,它可以完成优先级队列中项目的升序排序. 我想将Tuple2(Int,String)存储在优先级队列中,以便它按元组的第一个元素按升序排序. 如果我的优先级队列被称为pq,我调用pq.head我想得到数量最少的元组,同样调用pq.dequeue. scala val pq = sca
我想获得一个代码示例,它可以完成优先级队列中项目的升序排序.

我想将Tuple2(Int,String)存储在优先级队列中,以便它按元组的第一个元素按升序排序.
如果我的优先级队列被称为pq,我调用pq.head我想得到数量最少的元组,同样调用pq.dequeue.

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
)

这可能比撤消队列更有效,但可能不足以担心,因此您应该选择您认为最优雅的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读