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

时间:2018-04-19 22:32:24

标签: 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++)
        {
           list.add(0, queue.poll());
        }

3 个答案:

答案 0 :(得分:4)

请尝试以下代码:

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

为什么import org.apache.spark.ml.linalg.{Matrix, Vectors, Vector} import org.apache.spark.ml.stat.Correlation import org.apache.spark.sql.Row import scala.collection.Seq object BasicStatistics { def main(args: Array[String]): Unit = { val data: Seq[Vector] = Seq( Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))), Vectors.dense(4.0, 5.0, 0.0, 3.0), Vectors.dense(6.0, 7.0, 0.0, 8.0), Vectors.sparse(4, Seq((0, 9.0), (3, 1.0)))) val df = data.map(Tuple1.apply).toDF("features") val Row(coeff1: Matrix) = Correlation.corr(df, "features").head println(s"Pearson correlation matrix:\n $coeff1") val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head println(s"Spearman correlation matrix:\n $coeff2") } } 循环不起作用:

考虑迭代1:i = 0且i&lt;

queue.size()= 5 queue = {5,4,3,2,1} list = {}

迭代1之后:

queue = {5,4,3,2} list = {1} i = 1

在迭代2:i = 1 i&lt; queue.size()= 4 queue = {5,4,3,2} list = {1}

迭代2之后:queue = {5,4,3} list = {1,2} i = 2

在迭代3:i = 2 i&lt; queue.size()= 3 queue = {5,4,3,2} list = {1}

迭代3之后:queue = {5,4} list = {1,2,3} i = 3

在迭代4:i = 3 i&lt; queue.size()= 3? =&gt;假

退出循环!

所以当你仍然在队列= {5,4}时你要退出for循环并且所有的元素都没有被添加到列表中。

答案 1 :(得分:-2)

你正在轮询元素,这意味着你要从队列中删除它们,而你想迭代它。

我建议你使用

queue.peek()

代替。

答案 2 :(得分:-2)

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

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