8

听起来可能很傻,但是当您拥有 (key, value) 对的对象并根据键对它们进行排序时,这很有意义。用代码说明我的观点:

public class Pair implements Comparable<Pair> {
    private int value;
    private int key;

    public Pair(int key, int value) {
        this.key   = key;
        this.value = value;
    }

    @Override
    public int compareTo(Pair o) {
        if (this.key > o.key)
            return 1;
        else if (this.key < o.key)
            return -1;
        return 0;
    }
}

public class program {
    public static void main(String[] args) {
        PriorityQueue<Pair> queue = new PriorityQueue<Pair>;
        queue.add(new Pair(1,1));
        queue.add(new Pair(1,2));
        queue.add(new Pair(1,3));

        Pair pair = queue.poll(); // What would be in pair?
    }
}

里面会有什么pair?第一个或最后一个添加的元素?还是其中任何一个无法决定?

4

2 回答 2

8

PriorityQueue API 对这种情况不做任何承诺:

此队列的头部是相对于指定排序的最小元素。如果多个元素以最低值绑定,则头部是这些元素之一——绑定被任意打破。队列检索操作 poll、remove、peek 和 element 访问队列头部的元素。

但它很容易测试。将 toString 添加到 Pair

@Override
public String toString() {
    return key + " " + value;
}

并打印投票结果

    Pair pair = queue.poll(); // What would be in pair?
    System.out.println(pair);

它打印

1 1
于 2013-02-06T07:20:41.343 回答
-4

基本上Queue是 firstInfirstOut 数据结构。

在-ity 中定义了顺序PriorityQueuecomparable

与您的所有情况的优先级Pair()相同。因此顺序没有变化。

先进先出Pairs (1,1) (1,2) (1,3)

根据文档

队列检索操作 poll、remove、peek 和 element 访问队列头部的元素。

于 2013-02-06T07:14:37.067 回答