Tôi nghĩ, trường hợp sử dụng của PR là, rằng anh ta cần đầu, nhưng cũng muốn có một PQ nhỏ, vì vậy ý tưởng là để loại bỏ đuôi.
Khi PQ được thực hiện dưới dạng cây nhị phân được ánh xạ tới một mảng, đầu luôn là phần tử đầu tiên của mảng sao lưu (queue[0]
), nhưng đuôi không phải lúc nào cũng ở cuối mảng, bạn phải tìm kiếm nó.
Tôi nghĩ một cách tốt đẹp là để phân lớp PQ và viết hai phương pháp sau đây:
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;
}
}
Bạn có thể tạo một trường hợp 'PriorityQueue' mới và di chuyển tất cả các phần tử từ hàng đợi ban đầu sang hàng đợi mới ngoại trừ đuôi. –
http: // stackoverflow.com/questions/7878026/is-there-a-priorityqueue-implementation-with-fixed-capacity-và-custom-comparato – NPE