Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要列出的优先级队列。添加不正确_Java_List_Priority Queue - Fatal编程技术网

Java 要列出的优先级队列。添加不正确

Java 要列出的优先级队列。添加不正确,java,list,priority-queue,Java,List,Priority Queue,我正在尝试将项目从优先级队列复制到ArrayList中。出于某种原因,当有三个或四个项目时,它会在向列表中添加两个项目后停止。 如果有5个项目,则在将3个项目复制到列表后停止。我做错了什么 PriorityQueue<T> queue= new PriorityQueue<T> () ; List<T> list = new ArrayList<T>(); for (int i = 0 ; i< queue.size(); i++)

我正在尝试将项目从优先级队列复制到
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());
        }
PriorityQueue queue=newpriorityqueue();
列表=新的ArrayList();
对于(int i=0;i
您正在轮询元素,这意味着您正在将它们从队列中删除,而您希望对其进行迭代

我建议你使用

queue.peek()

相反。

请尝试以下代码:

PriorityQueue<T> queue= new PriorityQueue<T> () ; 
List<T> list = new ArrayList<T>();

while(!queue.isEmpty()){
       list.add(0, queue.poll());
    }
PriorityQueue queue=newpriorityqueue();
列表=新的ArrayList();
而(!queue.isEmpty()){
添加(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]

    }
}
import java.util.*;
导入java.lang.*;
导入java.io.*;
班长{
公共静态void main(字符串[]args){
PriorityQueue=新建PriorityQueue();
添加(5);
添加(4);
添加(3);
添加(2);
添加(1);
列表=新的ArrayList();
而(!queue.isEmpty()){
添加(0,queue.poll());
}
System.out.println(list);//Prints[5,4,3,2,1]
}
}
为什么您的
for
循环不起作用:

考虑迭代1:i=0和i

假的

退出循环


因此,当队列仍然为{5,4}且所有元素都未添加到列表中时,您将退出for循环。

ArrayList有一个接受集合的构造函数。PriorityQueue实现收集。您不需要遍历队列

PriorityQueue<T> queue= new PriorityQueue<T>();
List<T> list = new ArrayList<T>(queue);
PriorityQueue queue=new PriorityQueue();
列表列表=新的ArrayList(队列);

无法按特定顺序进行迭代。我要做的是一次删除一个,以便我的ArrayList从最大到最小排序。队列无法工作,因为它只能访问树的根。我永远不会得到其他元素。顺便说一句,队列是从最大到最小排序的,您不需要重新排序。PQ只在您从队列中删除时排序。请参阅Javadoc。这将不起作用。您还可以补充一点,OP循环失败的原因是队列.size()每次迭代都变小。保存循环的结尾也会有效Jontro,你介意详细说明一下吗?我想知道为什么我的循环不起作用。你保存循环是什么意思?哦,我明白你的意思了。所以,我的I在增加,而我的队列,siz()正在减少,所以它们在中间相遇。相反,我应该将原来的queue.size()保存在一个变量中并使用它?你根本不应该使用
I
。你没有在循环中使用它。这是毫无意义的。根据这个答案,只要在队列不是空的时候迭代就行了。这很有意义!谢谢EJP!PQ仅在您从中移除时才进行订购。请参阅Javadoc。这是行不通的。这种方法非常有效。Javadocs并没有说它不起作用。您可以使用优先级队列中的所有元素创建ArrayList,尽管没有指定顺序。如果这不起作用,队列将无法通过收集接口的契约。这就是我所说的。秩序得不到维护。Javadoc这样说:“方法
Iterator()
中提供的
Iterator
不能保证以任何特定顺序遍历优先级队列的元素。”。此解决方案创建一个ArrayList,其中包含PriorityQueue中的所有元素。没有维持秩序的要求。