我有一个可以按升序排序的工人阶级,但如果我改变逻辑,我的结果就不是我所期待的。也许我不明白比较器是如何工作的。如果我使用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;
}
}
答案 0 :(得分:2)
PriorityQueue迭代器返回的元素不是使用队列的顺序排序的。
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。
唯一的保证是peek()
或poll()
返回的队列的 head 是队列中所有元素中最小的。
如果需要已排序的集合,请使用您排序的TreeSet或List。
答案 1 :(得分:0)
此外,根据 javadoc ,方法PriorityQueue.iterator()中提供的Iterator不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。
因此,迭代器不会以任何特定顺序返回元素。