我得到了以下问题要解决:我使用特定对象的PriorityQueue,并且我用于将其与其他对象进行比较的属性设置为所有对象的相同值。
问题是:我需要修改它的一个对象(我的意思是,通过另一个属性找到它,并修改可比属性)并将其从队列中取出。我不知道怎么做,因为peek()和poll()只是移除并返回队列的头部,而remove()只是移除对象,这并不是我想要的。我也不知道如何在这里使用迭代器
这是我现在得到的代码:
public void inicializaDijkstra(Grafo grafo, Vertice v0){
Comparator<Grafo> comparator = new verticecomparator();
PriorityQueue<Grafo> Queue = new PriorityQueue<Grafo>(grafo.getNumeroDeVertices,grafo);
for (Vertice vertice : conjuntoDeVertices) {
queue.add(vertice);
}
我只是想用迭代器获得我想要的元素,从队列中删除它,修改它,然后(如果我不想删除它)将它再次添加到队列中。这能行吗?
我只是想用Iterator获得我想要的元素,从队列中删除它,修改它,然后(如果我不想删除它)将它再次添加到队列中。这能行吗?
它应该工作1。
事实上,考虑到你的数据结构选择,我想不出更好/更有效的方法来做到这一点。
注意,该方法是O(N)
,其中N
是队列长度。在多线程上下文中,您可能需要在独占锁下执行整个序列,这可能会使其成为并发瓶颈。
1 -实际上,在一些队列实现中,在迭代优先级队列时添加(回)元素可能会导致ConcurrentModificationException
。如果这是一个问题,那么您可能需要创建一个需要重新插入的元素列表,然后在完成迭代后重新插入它们。javadocs似乎说PriorityQueue
会给出CME's,但PriorityBlockingQueue
不会。