JAVA - 优先级队列比较双降序

时间:2014-08-03 15:27:44

标签: java priority-queue comparator

我有一个可以按升序排序的工人阶级,但如果我改变逻辑,我的结果就不是我所期待的。也许我不明白比较器是如何工作的。如果我使用poll来打印我的队列,那么我会丢失这些数据。如何在不丢失数据的情况下将其打印出来?目前我制作临时队列并重新插入旧队列。

public class Example
{
    private static Logger log   = LogClass.getLog();

    private PriorityQueue<Double> integerPriorityQueue;

    void inputIntoQueue(Collection<Double> queueNumbers)
    {
        Comparator<Double> comparator = new DoubleComparator();
          integerPriorityQueue = new PriorityQueue<Double>(comparator);
          integerPriorityQueue.addAll(queueNumbers);

          Iterator<Double> it = integerPriorityQueue.iterator();

         log.trace("Priority queue values are: ");

          while (it.hasNext())
              {
                log.trace( it.next()); 
              }      
    }   
}

 class DoubleComparator implements Comparator<Double>
{

    @Override
    public int compare(Double arg0, Double arg1)
        {
                if (arg1 < arg0)
                {
                    return -1;
                }
                if ( arg1  > arg0 )
                {
                    return 1;
                }
                return 0;
        }
}

更新我的代码

public class Example
{
    private static Logger              log                 = LogClass.getLog();
    private DoubleComparatorDescending  comparator         = new DoubleComparatorDescending();
    private PriorityQueue<Double>      doublePriorityQueue  = new PriorityQueue<Double>(
                                                                   comparator);
    private PriorityQueue<Double>      tempQueue           = new PriorityQueue<Double>(
                                                                   comparator);

    public PriorityQueue<Double> getDoublePriorityQueue()
        {
            return doublePriorityQueue;
        }


    void inputIntoQueue(Collection<Double> queueNumbers)
        {
            doublePriorityQueue.addAll(queueNumbers);
            printQueue(doublePriorityQueue);
        }

    private void printQueue(PriorityQueue<Double> integerPriorityQueue2)
        {
            log.trace("Priority queue values are: ");

            while (doublePriorityQueue.size() > 0)
                {
                    Double tempDouble = doublePriorityQueue.poll();
                    log.trace(tempDouble);
                    tempQueue.add(tempDouble);
                }
            doublePriorityQueue = tempQueue;
        }
}

class DoubleComparatorDescending implements Comparator<Double>
{
    @Override
    public int compare(Double arg0, Double arg1)
        {
            if (arg1 < arg0)
                {
                    return -1;
                }
            if (arg1 > arg0)
                {
                    return 1;
                }
            return 0;
        }
}

2 个答案:

答案 0 :(得分:2)

PriorityQueue迭代器返回的元素不是使用队列的顺序排序的。

The javadoc说:

  

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

唯一的保证是peek()poll()返回的队列的 head 是队列中所有元素中最小的。

如果需要已排序的集合,请使用您排序的TreeSet或List。

答案 1 :(得分:0)

此外,根据 javadoc ,方法PriorityQueue.iterator()中提供的Iterator不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。

因此,迭代器不会以任何特定顺序返回元素。