将指定的比较器添加到java priorityqueue

时间:2018-02-15 13:38:31

标签: java priority-queue

我很难理解如何优先使用compareTo方法对其内容进行排序。

我上课叫做Node。 它有4个领域。

private char character;
private int frequency;
private Node left_child;
private Node right_child;

然后在我的另一个名为Huffmantree的课程中,我有一个优先级。

我的问题:

我想将对象节点放入队列中,以便在出队时取决于节点的(int)频率。

现在我的Node类看起来像这样:

/**
 * Class for creating nodes with a specified character, frequency, 
 *  left- and right child.
 * implements comparable to be able to compare 2 nodes based on their 
 *  frequency.
*/
public class Node implements Comparable<Node>{

    private char character;
    private int frequency;
    private Node left_child;
    private Node right_child;

    public Node(char character, int frequency, Node left_child, Node 
                 right_child){

         this.character = character;
         this.frequency = frequency;
         this.left_child = left_child;
         this.right_child = right_child;
    }
    //Checks if two nodes have equal frequency.
    private boolean equals(Node n){

        return this.frequency == n.frequency;
    }



    @Override
    public int compareTo(Node other) {

        if(this.equals(other)){
            return 0;
        }else if(this.frequency > other.frequency){
            return 1;
        }else return -1;

    }

    //Print out current node
    @Override
    public String toString(){

        return "[" +this.character+"," + this.frequency +"]";

    }

这里我试图实现Comparable接口 我已经定义了一个CompareTo方法,将节点与它们的频率值进行比较。

在我的HuffmanTree课程中,我试图制作一个像这样的优先级:

PriorityQueue<Node> pq = new PriorityQueue<>(new Comparator<Node>()

但我不知道你是怎么做的。我被卡住了,我还没有找到一个很好的例子。

2 个答案:

答案 0 :(得分:2)

由于您的Node类已经实现了Comparable接口,因此无需定义Comparator<Node>并将其传递给您的队列对象,只需使用无参数构造函数:< / p>

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

根据官方documentation

public PriorityQueue() 
     

使用默认值创建PriorityQueue   初始容量(11)根据其元素对其元素进行排序   自然排序。

在这种情况下,您已通过为compareTo对象实施Node方法定义了自然排序,因此您已完成大量工作。如果队列中的元素不是Comparable,或者您希望使用不同的顺序,则只能使用带有比较器的其他构造函数:

// This queue will hand out nodes in the inverse order of their frequency
PriorityQueue<Node> queue = new PriorityQueue<>(new Comparator<Node>() {
    @Override
    public int compare(Node a, Node b) {
        return -a.compareTo(b);
    }
});

答案 1 :(得分:0)

compareTo()用于比较两个对象。

因此,如果您想根据频率进行比较,那么您应该写:

public int compareTo(Node other) {    
        if(frequency>other.frequency)
            return 1;
        else if(frequency==other.frequency) 
             return 0;
         return -1;
    }

这里我们将当前频率与参数化对象进行比较。

您可以从here

获取详细说明

你不需要这个:

  

PriorityQueue pq = new PriorityQueue&lt;&gt;(new Comparator())

你可以这样写:

  

PriorityQueue pq = new PriorityQueue&lt;&gt;();