使用优先级队列对java中的元素进行排序

时间:2018-06-11 11:32:53

标签: java queue comparator priority-queue comparable

我想在Java中使用Priority Queue对元素进行排序。

这是我的代码。有什么问题?

import java.io.*;
import java.util.*;

class PQ {
    static class IntCompare implements Comparator<Integer>{
        @Override
        public int compare(Integer arg0, Integer arg1) {
            if(arg0 > arg1)
                return -1;
            else if(arg0 < arg1)
                return 1;
            else
                return 0;
        }
   }

    public static void main (String[] args) {
        int a[] = { 1, 3, 8, 5, 2, 6 };

        Comparator<Integer> c = new IntCompare();
        PriorityQueue<Integer> pq=new PriorityQueue<>(c);

        for(int i = 0; i < a.length; i++)
            pq.add(a[i]);

        System.out.println(pq);
    }
}

我的输出是:

8, 5, 6, 1, 2, 3

正确输出:

8, 6, 5, 3, 2, 1

3 个答案:

答案 0 :(得分:1)

当您致电System.out.println(pq)时,会隐式调用toString方法。

PriorityQueue的{​​{3}}方法来自AbstractCollection

  

返回此集合的字符串表示形式。字符串   表示由一个集合的元素列表组成   它们由它的迭代器返回,用方括号括起来   ( “[]”)。

虽然PriorityQueue的{​​{3}}无法保证以特定顺序遍历:

  

不保证方法iterator()中提供的迭代器   以任何特定顺序遍历优先级队列的元素。

因为队列基于toString

您可以逐个轮询元素以获取有序元素:

while (pq.size() != 0) {
    System.out.print(pq.poll() + ","); // 8,6,5,3,2,1,
}

答案 1 :(得分:0)

你应该sorted所有元素,直到队列为空,然后将它们保存到某个位置以便排序。

答案 2 :(得分:0)

尝试以下操作,列表包含按排序顺序排列的项目。 优先级密钥本身不按排序顺序维护元素,它只是根据您的PQ实现将顶部元素保持为最小值或最大值。

public static void main (String[] args) {
        int a[]={1,3,8,5,2,6};
        Comparator<Integer> c = new IntCompare();
        PriorityQueue<Integer> pq=new PriorityQueue<>(c);
        for(int i=0;i<a.length;i++)
            pq.add(a[i]);
        ArrayList<Integer> list  = new ArrayList<>();
        while(!pq.isEmpty()){
            list.add(pq.poll());
        }
        for(Integer i : list)
            System.out.println(i);
}