2

如果我有一个由 T 个对象组成的 PriorityQueue,并且 T 有一个 compareTo() 方法并实现了可比较,但我的 PriorityQueue 也将比较器作为参数,那么我的 PriorityQueue 将寻找什么元素的顺序?

换句话说,哪一个决定了对象的优先级?compareTo() 方法还是提供的比较器?

4

4 回答 4

3

对于标准 PriorityQueue,如果您使用 构造它Comparator<T>,那么它将确定优先级。如果没有,那么Comparable<T>将决定它。这在PriorityQueue API中有很好的描述

于 2012-11-30T02:59:09.630 回答
3

构造函数参数的文档comparator指出

comparator- 用于排序此优先级队列的比较器。如果为 null,则顺序取决于元素的自然顺序。

这意味着当comparator指定 a 时,方法建立的自然顺序将compareTo被忽略。

于 2012-11-30T02:59:44.493 回答
1

我正在阅读 Oracle 类实现的源代码PriorityQueue,它检查是否正在使用 Comparator 并首先使用它。否则,它使用 Comparable 对象。

于 2012-11-30T03:03:01.623 回答
0

Comparable 定义集合中类的自然顺序,而 Comparator 允许您提供不同的顺序。如果您决定提供不同的比较器,它将覆盖自然顺序。通过不输入比较器,它将恢复到 compareTo 方法设置的自然顺序。

于 2012-11-30T03:09:18.017 回答