PriorityQueue和Comparator

时间:2011-10-29 21:03:21

标签: java priority-queue

我试图从localNodes获得距离hashmap距离最小的节点。当我在远程hashmap中更改任何值时队列没有重新排序时的问题我认为问题是因为我正在实现比较器接口,就像它将作为内部类并强制我将hashmap声明为final。 有什么不同的方法。

    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) );
                }
            });

2 个答案:

答案 0 :(得分:4)

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

我不知道您是如何使用此队列的,但一种可能的解决方案是只在您HashMap中存储节点,并在您更改{{1}时创建新的PriorityQueue }}。新创建的队列将具有正确的顺序。

答案 1 :(得分:3)

你不能这样做(参见科林的回答)。我可以建议一个解决方法:

创建一个看起来像这样的NodeEntry对象:

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

使用PriorityQueue<NodeEntry>。但是如果你改变NodeEntry的{​​{1}},那么什么都不会改变。当某些值发生变化时,您无法对队列重新排序。