【问题标题】:sort the elements in java using priority queue使用优先级队列对java中的元素进行排序
【发布时间】:2018-06-11 11:32:52
【问题描述】:

我想使用 Java 中的优先级队列对元素进行排序。

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

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

【问题讨论】:

  • 您的 PriorityQueue 是有序的,toString 只是以无特定顺序输出它们(如 Javadoc 中明确说明的那样)。还可以考虑使用Comparator.reverseOrder() 而不是重新发明轮子。

标签: java queue comparator priority-queue comparable


【解决方案1】:

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

PriorityQueuetoString 方法扩展自 AbstractCollection,其中

返回此集合的字符串表示形式。字符串 表示由集合中的元素列表组成 其迭代器返回的顺序,用方括号括起来 ("[]")。

虽然PriorityQueueiterator 不能保证按特定顺序遍历:

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

因为队列基于heap

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

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

【讨论】:

    【解决方案2】:

    你应该poll()所有元素直到队列为空,然后将它们保存在某个地方以便让它们排序。

    【讨论】:

      【解决方案3】:

      尝试以下操作,列表按排序顺序包含项目。 priority key 本身并不维护元素的排序顺序,它只是根据您的 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多