使用MultiMap-Java的优先级队列

使用MultiMap-Java的优先级队列,java,priority-queue,guava,multimap,Java,Priority Queue,Guava,Multimap,我必须使用MultiMap实现优先级队列。我使用谷歌收藏的多重地图。 下面的代码创建一个多重映射并向其中添加少量元素 Multimap<Integer, String> multimap = HashMultimap.create(); multimap.put(5,"example"); multimap.put(1,"is"); multimap.put(1,"this"); multimap.put(4,"some"); Multim

我必须使用MultiMap实现优先级队列。我使用谷歌收藏的多重地图。 下面的代码创建一个多重映射并向其中添加少量元素

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

    multimap.put(5,"example");
    multimap.put(1,"is");
    multimap.put(1,"this");
    multimap.put(4,"some");
Multimap Multimap=HashMultimap.create();
multimap.put(5,“示例”);
多重映射put(1,“is”);
multimap.put(1,“this”);
multimap.put(4,“some”);
现在我的问题是如何编写pop方法

我认为应该有一个for循环,它应该在MultiMap中迭代


最低的键应该是最高优先级,所以在C++中,我会给第一个元素设置一个指针,并增加它。如何在Java中实现这一点?

如果我正确理解您正在使用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());
}
public Collection pop(){
SortedSet keys=新树集(multimap.keySet());
返回multimap.get(keys.first());
}

您正在使用的
HashMultimap
在有效选择最低元素方面没有任何帮助。相反,请使用
TreeMultimap
(也在Google Collections中),它允许您指定顺序并按该顺序遍历列表中的项目。例如:

for (Map.Entry<Integer, String> entry : multimap.entries()) {
  System.out.println("Item " + entry.getValue() + " has priority " + entry.getKey();
}
for(Map.Entry:multimap.entries()){
System.out.println(“项”+entry.getValue()+“具有优先级”+entry.getKey();
}
您会注意到,这总是按优先级顺序打印条目,因此要获得第一个优先级元素,只需执行
multimap.entries().iterator().next()
(假设您知道映射至少有一个元素)

有关更多信息,请参阅。

您可以简单地在JDK中使用该类吗

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

Iterator<String> iterator = multimap.values().iterator();
String value = iterator.next();
iterator.remove();
Iterator Iterator=multimap.values().Iterator();
字符串值=迭代器.next();
iterator.remove();

问题是我必须在这个项目中使用MultiMap:/jacobm的答案更简单,因为TreeMultimap已经为您完成了所有这些。我对google collections不太熟悉,所以我没有意识到他们已经有了一个这样做的类。SortedSet是否可以像MultiMap中那样包含两个或更多相同的键?集合没有“键”,它们只有元素,是的,您可以有重复的元素。谢谢,这很有用,但是如何遍历TreeMultiMap?使用
multimap.entries()
并使用其
iterator()
方法遍历它。我将更新答案。我想这将是最后一个问题:我可以通过以下方式显示对象:
System.out.println(multimap.entries().iterator().next());
现在如何删除这个第一优先级元素(像pop方法通常做的那样)?最简单的方法就是使用multimap.remove(key,value)。谢谢你的回答。我终于完成了。