12

在 Java 中,我不知道如何PriorityQueue使用新的比较器创建一个新的但没有给出队列长度?我怎样才能创建它?

我知道我可以写:

Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>();

但我希望队列可以这样工作LinkedList,我的意思是它的长度不是固定的,我该如何声明它?

4

4 回答 4

11

现代答案,截至 2021 年:https ://stackoverflow.com/a/30015986/139010


Pre-Java-8 答案,供后代使用:

没有这样的构造函数。根据 JavaDocs,默认容量为 11,因此您可以将其指定为与无参数PriorityQueue构造函数类似的行为:

Queue<Node> theQueue = new PriorityQueue<Node>(11,new Comparator<Node>());

的,如果需要,队列会增加。

优先级队列是无界的,但具有控制用于存储队列元素的数组大小的内部容量。它总是至少与队列大小一样大。随着元素被添加到优先级队列中,其容量会自动增长。未指定增长政策的详细信息。x

于 2013-02-26T20:39:24.003 回答
5

从 Java 版本 8 开始,有一个新的构造函数可以满足您的要求:PriorityQueue(Comparator compare)

所以你会得到:

Queue<Node> theQueue = new PriorityQueue<>(new Comparator<Node>());
于 2015-05-03T15:59:47.390 回答
1

恐怕没有办法只指定 aComparator而不指定初始容量。请注意,这只是初始容量——队列可以从这个初始值开始增长。

于 2013-02-26T20:40:55.410 回答
0

您可以使用 Java Lambda(Java SE 8 中的一项功能)创建具有自定义比较器的优先级队列,而无需固定大小。

例如,您可以这样做:

PriorityQueue<String> pq = new PriorityQueue<>((s1, s2) -> s1.compareTo(s2));

请参阅有关 Lambda 的示例: https ://www.mkyong.com/java8/java-8-lambda-comparator-example/

于 2017-10-05T17:55:34.597 回答