使用MultiMap的优先级队列 - Java

时间:2010-10-16 17:25:23

标签: java priority-queue guava multimap

我必须使用MultiMap实现Priority Queue。我使用Google Collections中的MultiMap。 以下代码创建了一个MultiMap,并在其中添加了一些元素。

    Multimap<Integer, String> multimap = HashMultimap.create();

    multimap.put(5,"example");
    multimap.put(1,"is");
    multimap.put(1,"this");
    multimap.put(4,"some");

现在我的问题是如何编写pop方法?

我认为应该有一个for循环,它应该迭代通过MultiMap。

最低密钥应该是最高优先级,所以在C ++中我会设置一个指向第一个元素的指针并递增它。如何用Java做到这一点?

3 个答案:

答案 0 :(得分:10)

您使用的HashMultimap在有效选择最低元素方面不会给您任何帮助。而是使用TreeMultimap(也在Google集合中),它允许您指定顺序并按顺序遍历列表中的项目。例如:

for (Map.Entry<Integer, String> entry : multimap.entries()) {
  System.out.println("Item " + entry.getValue() + " has priority " + entry.getKey();
}

您会注意到这总是按优先级顺序打印输入,因此要获得第一优先级元素,您只需执行multimap.entries().iterator().next()(假设您知道地图至少有一个元素)。

有关详细信息,请参阅the TreeMultimap documentation

答案 1 :(得分:2)

如果我正确理解您正在使用Multimap作为您自己的PriorityQueue类的内部,而不是仅仅尝试将Multimap用作优先级队列,那么您应该保留一个SortedSet(我将其称为sortedKeys )所有的钥匙。然后你可以使用 multimap.get(sortedKeys.first())弹出第一个元素。

通过“保留SortedSet”,我的意思是每次向Multimap添加内容时,将其键添加到SortedSet。从Multimap中删除项目时,请从SortedSet中删除其键。目标是您的SortedSet保持等于Multimap.keySet(),但没有始终调用SortedSet.clear(); SortedSet.addAll(...)的开销。

另一种方法是每次创建一个SortedSet,这会慢得多。它可能会帮助你理解我在说什么:

public Collection<V> pop() {
    SortedSet keys = new TreeSet(multimap.keySet());
    return multimap.get(keys.first());
}

答案 2 :(得分:1)

你能简单地在JDK中使用PriorityQueue类吗?

使用jacobm建议的TreeMultimap方法,以下代码更简洁。

Iterator<String> iterator = multimap.values().iterator();
String value = iterator.next();
iterator.remove();