首页 > 解决方案 > 在自定义对象上使用优先级队列的更好方法

问题描述

我有一个Node包含 2 个字段的类,并且我Node基于字段为 this 的对象构建了一个优先级队列len

现在有两种方法可以做到这一点:

  1. PriorityQueue<Node> pq = new PriorityQueue<Node>(n);//size n queue
    此方法允许在类 Node 上实现 Comparable Interface,有点像这样:

    @Override  
    public int compareTo(Node o){  
        return this.len- o.len;
    }
    
  2. 另一种方式是:

    PriorityQueue<Node> pq = new PriorityQueue<Node>(n, new Node());

    这允许使用比较器接口:

    @Override  
    public int compareTo(Node node1, Node node2){  
        return node1.len-node2.len;}
    

这些方式中哪一种更可取?使用其中一个是否有任何优点/缺点?

标签: java

解决方案


在我看来,第二个有点假。需要一个比较器,你给它一个“碰巧实现”一个比较器接口的对象(我想)作为其真正目的的副业。在这种用途中,节点实际上并没有作为节点起作用,它只是一个带有方便比较器的东西。

这是我的看法:

  1. 如果您的节点具有独立于此特定优先级队列使用所需的顺序但与此顺序相同的自然顺序,那么它们应该实现 Comparable,现在您可以在优先级队列中使用它。

  2. 否则,如果您在这种特殊情况下只需要一个特定的顺序,那么将 Comparator 实现为一个完全独立于 Node 实现的类。


推荐阅读