我必须使用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做到这一点?
答案 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();