在 Java 中,我不知道如何PriorityQueue
使用新的比较器创建一个新的但没有给出队列长度?我怎样才能创建它?
我知道我可以写:
Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>();
但我希望队列可以这样工作LinkedList
,我的意思是它的长度不是固定的,我该如何声明它?
在 Java 中,我不知道如何PriorityQueue
使用新的比较器创建一个新的但没有给出队列长度?我怎样才能创建它?
我知道我可以写:
Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>();
但我希望队列可以这样工作LinkedList
,我的意思是它的长度不是固定的,我该如何声明它?
现代答案,截至 2021 年:https ://stackoverflow.com/a/30015986/139010
Pre-Java-8 答案,供后代使用:
没有这样的构造函数。根据 JavaDocs,默认容量为 11,因此您可以将其指定为与无参数PriorityQueue
构造函数类似的行为:
Queue<Node> theQueue = new PriorityQueue<Node>(11,new Comparator<Node>());
优先级队列是无界的,但具有控制用于存储队列元素的数组大小的内部容量。它总是至少与队列大小一样大。随着元素被添加到优先级队列中,其容量会自动增长。未指定增长政策的详细信息。x
从 Java 版本 8 开始,有一个新的构造函数可以满足您的要求:PriorityQueue(Comparator compare)
所以你会得到:
Queue<Node> theQueue = new PriorityQueue<>(new Comparator<Node>());
恐怕没有办法只指定 aComparator
而不指定初始容量。请注意,这只是初始容量——队列可以从这个初始值开始增长。
您可以使用 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/