回答
没有简单的方法。除最后一个外,将元素从原始复制到新元素。
PriorityQueue removelast(PriorityQueue pq)
{
PriorityQueue pqnew;
while(pq.size() > 1)
{
pqnew.add(pq.poll());
}
pq.clear();
return pqnew;
}
称为
pq = removelast(pq);
你也许可以利用番石榴的MinMaxPriorityQueue做到这一点。它为队列的两端提供peek,poll和remove方法。
另一种选择是编写一个强制边界的队列封装,类似于this answer。您需要执行offer
,add
和addAll
来检查容量。例如:
public class BoundedQueue<E> implements Serializable, Iterable<E>, Collection<E>, Queue<E> {
private final Queue<E> queue;
private int capacity;
public BoundedQueue(Queue<E> queue, int capacity) {
this.queue = queue;
this.capacity = capacity;
}
@Override
public boolean offer(E o) {
if (queue.size() >= capacity)
return false;
return queue.add(o);
}
@Override
public boolean add(E o) throws IllegalStateException {
if (queue.size() >= capacity)
throw new IllegalStateException("Queue full"); // same behavior as java.util.ArrayBlockingQueue
return queue.add(o);
}
@Override
public boolean addAll(Collection<? extends E> c) {
boolean changed = false;
for (E o: c)
changed |= add(o);
return changed;
}
// All other methods simply delegate to 'queue'
}
使用反转比较器并从头上移除。如果你需要使用错误的数据结构的头部和尾部。
如果你关心运行时,我建议实现你自己的队列。我做了以下工作,并在我的项目中工作。
1)复制粘贴的PriorityQueue代码 - > CustomQueue.java 2)添加的方法removeLast() 3)这是我所使用的实现(非常小)
public void removeLast() {
if(size == 0) {
return;
}
queue[size - 1] = null;
size--;
}
这个工作的原因是PriorityQueue的实现使用一个数组来保存对象。所以“大小”实际上是指向数组中下一个可用点的指针。通过减少它,数组/队列的大小会减少,就像删除最后一个元素一样。
我觉得,PR的用例是,他需要头部,但也想要一个小PQ,所以想法是去掉尾巴。由于PQ是作为映射到数组的二叉树实现的,因此头始终是后备数组的第一个元素(queue[0]
),但尾部并不总是在数组的末尾,必须搜索它。
我觉得一个很好的方式是继承PQ和写入以下两种方法:
public class MyPriorityQueue<E> extends PriorityQueue<E>
{
// constructors
public E getTail()
{
// queue.length can be bigger than this.size() !!
Object[] queue = this.toArray();
E tail = (E)queue[0];
Comparator<? super E> comparator = this.comparator();
if (comparator !=null)
for(int i = 1; i < this.size(); i++)
if (comparator.compare(tail, (E)queue[i]) < 0)
tail = (E)queue[i];
else
for(int j = 1; j < this.size(); j++)
if (((Comparable)tail).compareTo(((Comparable)queue[j])) < 0)
tail = (E)queue[j];
return tail;
}
public E removeTail()
{
E tail = this.getTail();
this.remove(tail);
return tail;
}
}
你的else块的缩进关闭 – manonthemat 2016-09-20 17:16:54
没有的情况下,更好的解决方案,你有充分的理由不产生另一元素的内存。
你可以获得队列的大小并用迭代器运行它,同时计算你要去的元素,一旦你到达最后一个或你正在寻找的元素,你可以使用PriorityQueue.remove(对象o)
Iterator<E> it = Queue.iterator();
while (it.hasNext()) {
temp<E> = it.next();
counter++;
if (counter == Queue.size()) {
Queue.remove(temp);
}
}
- 1. Java中的优先级队列中断删除重复元素
- 2. STL优先级队列 - 删除项目
- 3. 优先级队列中的优先级
- 4. 如何从列表中删除具有相应优先级队列的元素?
- 5. 为优先级较高的元素和其他优先级较低的元素排序优先队列
- 6. 常量大小优先级队列 - 先插入或先删除?
- 7. 优先级队列
- 8. Java优先级队列
- 9. 优先级队列,可比
- 10. 优先级队列C
- 11. 双重优先级队列
- 12. java优先级队列队列适应
- 13. 优先级队列VS队列
- 14. 查找最小优先级队列中最老的元素java
- 15. 优先级队列O(1)插入和删除
- 16. 从优先级队列中删除项目
- 17. 为优先级队列提供更多元素?
- 18. 优先级队列可以有空元素(如数组)吗?
- 19. 新近度是次要优先级的优先级队列?
- 20. 具有动态项目优先级的优先级队列
- 21. 优先级队列的优先级总是需要是整数?
- 22. 当队列已满时在优先级队列(Java)中插入一个元素
- 23. 如何删除与最低优先级的元素在C++
- 24. 优先级队列的ArrayList HashMap的
- 25. Java链接列表优先级队列
- 26. 更改Minix3的优先级队列
- 27. 不符合QoS优先级的队列
- 28. 比较JAVA中的优先级队列
- 29. 节点的优先级队列
- 30. Java中的优先级队列
您可以创建一个新的'PriorityQueue'实例并将所有元素从初始队列移动到除尾部之外的所有元素。 – 2013-02-27 16:34:26
http:// stackoverflow。com/questions/7878026/is-there-a-priorityqueue-implementation-with-fixed-capacity-and-custom-comparato – NPE 2013-02-27 16:37:36