Java中的PriorityQueue不是确定性的吗? [英] PriorityQueue in Java not deterministic?

查看:0
本文介绍了Java中的PriorityQueue不是确定性的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我运行以下优先级队列测试时:

class Run {

public static void main(String[] args) {
    PriorityQueue<Entry> q = new PriorityQueue<>(8, Collections.reverseOrder(new Comparator<Entry>() {

        @Override
        public int compare(Entry o1, Entry o2) {
            return Integer.compare(o1.getValue(), o2.getValue());
        }
    }));

    q.offer(new Entry(100));
    q.offer(new Entry(0));
    q.offer(new Entry(1));
    q.offer(new Entry(-1));
    q.offer(new Entry(0));
    q.offer(new Entry(1));
    q.offer(new Entry(-100));
    q.offer(new Entry(100));

    while (q.peek() != null) {
        System.out.println(q.poll());
    }
}

private static class Entry {

    private static int GLOBAL_ID = 0;

    private final int value, id;

    public Entry(int value) {
        this.value = value;
        id = GLOBAL_ID++;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Entry[" + id + ", value = " + value + ']';
    }
}

}

我得到以下结果:

Entry[0, value = 100]
Entry[7, value = 100]
Entry[2, value = 1]
Entry[5, value = 1]
Entry[4, value = 0]
Entry[1, value = 0]
Entry[3, value = -1]
Entry[6, value = -100]
我希望以与输入相同的顺序输出相等的元素,因此当条目0在条目7之前提供时,它也会在轮询7之前被轮询。但是为什么条目4突然在1之前被轮询?是错误的Comparator还是PriorityQueue不能保证确定性行为?

推荐答案

它是非确定性的。

来自documentation for PriorityQueue

如果多个元素的值最小,则头元素是 那些元素--纽带被任意打破。

这篇关于Java中的PriorityQueue不是确定性的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆