2011-10-29 63 views
0

我想从localNodes中获得与散列表距离最小距离的节点。当我改变距离hashmap中的任何值的问题队列不重新排序我认为这个问题是因为我正在实现比较接口,就像那将作为内部类,并强制我声明hashmap为final。 有什么不同的方法。PriorityQueue和比较器

final HashMap<Node, Double> distance = new HashMap<>(); 
    PriorityQueue<Node> localNodes = new PriorityQueue<>(10, 
      new Comparator() { 

       @Override 
       public int compare(Object o1, Object o2) { 
        return distance.get((Node)o2).compareTo(distance.get((Node)o2)); 
       } 
      }); 

回答

4

不能更改元素的相对顺序(在这种情况下,通过改变距离值它们映射到),其已经在一个有序集合,如PriorityQueueSortedSet并期望在自己的位置因此收集改变。首先,数据结构并不是为此而构建的。另一方面,在您的示例中,PriorityQueue将不会收到您对HashMap所做的任何更改的通知,因此即使它旨在这样做,它也无法响应。

我不知道你是如何使用这个队列,但一个可能的解决办法是只在节点存储在您HashMap并创建一个新的PriorityQueue每当变更HashMap。新创建的队列将具有正确的顺序。

+0

是的,你是对的,+1 – Bozho

+0

我明白这个原因在这里:) –

3

你不能这样做(见科林的回答)。我可以提出一个解决办法:

做一个NodeEntry对象,它看起来像这样:

public class NodeEntry { 
    private Node node; 
    private Double value; 
} 

和使用PriorityQueue<NodeEntry>。但如果你改变NodeEntryvalue什么都不会改变。某些值发生更改时,您无法重新排列队列。