要列出的优先队列。没有正确添加

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());
 }