java - 在自定义对象上使用优先级队列的更好方法
问题描述
我有一个Node
包含 2 个字段的类,并且我Node
基于字段为 this 的对象构建了一个优先级队列len
。
现在有两种方法可以做到这一点:
PriorityQueue<Node> pq = new PriorityQueue<Node>(n);//size n queue
此方法允许在类 Node 上实现 Comparable Interface,有点像这样:@Override public int compareTo(Node o){ return this.len- o.len; }
另一种方式是:
PriorityQueue<Node> pq = new PriorityQueue<Node>(n, new Node());
这允许使用比较器接口:
@Override public int compareTo(Node node1, Node node2){ return node1.len-node2.len;}
这些方式中哪一种更可取?使用其中一个是否有任何优点/缺点?
解决方案
在我看来,第二个有点假。需要一个比较器,你给它一个“碰巧实现”一个比较器接口的对象(我想)作为其真正目的的副业。在这种用途中,节点实际上并没有作为节点起作用,它只是一个带有方便比较器的东西。
这是我的看法:
如果您的节点具有独立于此特定优先级队列使用所需的顺序但与此顺序相同的自然顺序,那么它们应该实现 Comparable,现在您可以在优先级队列中使用它。
否则,如果您在这种特殊情况下只需要一个特定的顺序,那么将 Comparator 实现为一个完全独立于 Node 实现的类。
推荐阅读
- html - 有没有办法在另一个组件中使用可变 Angular 组件,并将数据传递给该可变组件?
- vk - VK newsfeed.search -- 搜索字符串不考虑 " " 用于精确词搜索
- reactjs - 设置状态需要双击
- computer-vision - 使用 YOLO 对具有挑战性的图像进行文本检测
- swift - 来自 String 的 UUID 在应用程序中不起作用,但在 Playground 中起作用
- c# - 如何根据未提供的 DateTime 值过滤 SQLite 数据库中的记录?
- javascript - 如何在 JavaScript 中发出 http 请求
- java - 服务通知为白色
- ios - App stuck on splash screen - ending with an NSException on Xcode
- windows - Powershell 5.1 在新的控制台窗口上启动任何控制台命令