要列出的优先队列。没有正确添加
Priority Queue to List. not adding properly
我正在尝试将项目从优先队列复制到 ArrayList
。出于某种原因,当有三个或四个项目时,它会在将两个项目添加到列表后停止。
如果有 5
项,它将在将 3
项复制到列表后停止。我做错了什么?
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
for (int i = 0 ; i< queue.size(); i++)
{
list.add(0, queue.poll());
}
您正在轮询元素,这意味着您正在将它们从队列中删除,同时您想对其进行迭代。
我建议您使用
queue.peek()
相反。
试试下面的代码:
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
while(!queue.isEmpty()){
list.add(0, queue.poll());
}
一个例子:
import java.util.*;
import java.lang.*;
import java.io.*;
class Main{
public static void main (String[] args) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.add(5);
queue.add(4);
queue.add(3);
queue.add(2);
queue.add(1);
List<Integer> list = new ArrayList<>();
while(!queue.isEmpty()) {
list.add(0,queue.poll());
}
System.out.println(list); // Prints [5, 4, 3, 2, 1]
}
}
为什么您的 for
循环不起作用:
考虑迭代 1:i = 0 且 i <
queue.size() = 5 队列 = {5,4,3,2,1} 列表 = {}
迭代 1 后:
队列 = {5,4,3,2} 列表 = {1} i = 1
在第 2 次迭代:i = 1 i < queue.size() = 4 queue = {5,4,3,2} list = {1}
迭代2后:queue = {5,4,3} list = {1,2} i = 2
在第 3 次迭代:i = 2 i < queue.size() = 3 queue = {5,4,3,2} list = {1}
迭代 3 后:queue = {5,4} list = {1,2,3} i = 3
在第 4 次迭代:i = 3 i < queue.size() = 3? = > 错误
退出循环!
所以当 queue = {5,4} 并且所有元素都没有添加到列表时,您将退出 for 循环。
ArrayList 有一个接受 Collection 的构造函数。 PriorityQueue 实现 Collection。您不需要遍历队列。
PriorityQueue<T> queue= new PriorityQueue<T>();
List<T> list = new ArrayList<T>(queue);
原因是,每次迭代都会重新计算队列大小,但在循环内减小了队列大小。
所以,不是在 for 循环中计算队列大小...在 for 循环之外计算它。这样代码就不需要为每次迭代重新计算它,即使队列大小在循环内减小,它仍然完全迭代到列表的初始大小。
类似的东西:
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
int qSize = queue.size();
for (int i = 0 ; i< qSize; i++)
{
list.add(0, queue.poll());
}
我正在尝试将项目从优先队列复制到 ArrayList
。出于某种原因,当有三个或四个项目时,它会在将两个项目添加到列表后停止。
如果有 5
项,它将在将 3
项复制到列表后停止。我做错了什么?
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
for (int i = 0 ; i< queue.size(); i++)
{
list.add(0, queue.poll());
}
您正在轮询元素,这意味着您正在将它们从队列中删除,同时您想对其进行迭代。
我建议您使用
queue.peek()
相反。
试试下面的代码:
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
while(!queue.isEmpty()){
list.add(0, queue.poll());
}
一个例子:
import java.util.*;
import java.lang.*;
import java.io.*;
class Main{
public static void main (String[] args) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.add(5);
queue.add(4);
queue.add(3);
queue.add(2);
queue.add(1);
List<Integer> list = new ArrayList<>();
while(!queue.isEmpty()) {
list.add(0,queue.poll());
}
System.out.println(list); // Prints [5, 4, 3, 2, 1]
}
}
为什么您的 for
循环不起作用:
考虑迭代 1:i = 0 且 i <
queue.size() = 5 队列 = {5,4,3,2,1} 列表 = {}
迭代 1 后:
队列 = {5,4,3,2} 列表 = {1} i = 1
在第 2 次迭代:i = 1 i < queue.size() = 4 queue = {5,4,3,2} list = {1}
迭代2后:queue = {5,4,3} list = {1,2} i = 2
在第 3 次迭代:i = 2 i < queue.size() = 3 queue = {5,4,3,2} list = {1}
迭代 3 后:queue = {5,4} list = {1,2,3} i = 3
在第 4 次迭代:i = 3 i < queue.size() = 3? = > 错误
退出循环!
所以当 queue = {5,4} 并且所有元素都没有添加到列表时,您将退出 for 循环。
ArrayList 有一个接受 Collection 的构造函数。 PriorityQueue 实现 Collection。您不需要遍历队列。
PriorityQueue<T> queue= new PriorityQueue<T>();
List<T> list = new ArrayList<T>(queue);
原因是,每次迭代都会重新计算队列大小,但在循环内减小了队列大小。
所以,不是在 for 循环中计算队列大小...在 for 循环之外计算它。这样代码就不需要为每次迭代重新计算它,即使队列大小在循环内减小,它仍然完全迭代到列表的初始大小。
类似的东西:
PriorityQueue<T> queue= new PriorityQueue<T> () ;
List<T> list = new ArrayList<T>();
int qSize = queue.size();
for (int i = 0 ; i< qSize; i++)
{
list.add(0, queue.poll());
}