根据this question,我订购了一个Java Map
,如下所示:
ValueComparator bvc = new ValueComparator(originalMap);
Map<String,Integer> sortedMap = new TreeMap<String,Integer>(bvc);
sortedMap.putAll(originalMap);
现在,我想以top-K的方式从地图中提取K
最相关的值。有没有一种高效的方法,无需迭代地图?
P.S。,一些类似的问题(例如,this)要求解决前1个检索问题。
答案 0 :(得分:4)
不,如果您使用Map
则不行。你必须迭代它。
您是否考虑过使用PriorityQueue
?这是Java的堆实现。它具有插入任意元素和删除“最小”的有效操作。你可能会考虑在这里做这件事。您可以将它们放入按相关性排序的Map
而不是PriorityQueue
,而最相关的是根。然后,要提取最相关的 K ,您只需从PriorityQueue
中弹出 K 元素。
如果您需要类似地图的属性(从String
到Integer
的映射),那么您可以编写一个内部保留PriorityQueue
和{{1 }}。插入时,插入两者;当您删除最小元素时,您会从HashMap
弹出,然后告诉您还需要从PriorityQueue
中删除哪个元素。这仍然会为您提供日志时间插入和最小删除。