在Java TreeMap中检索N个最相关的对象

时间:2014-10-28 13:59:39

标签: java performance map

根据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个检索问题。

1 个答案:

答案 0 :(得分:4)

不,如果您使用Map则不行。你必须迭代它。

您是否考虑过使用PriorityQueue?这是Java的堆实现。它具有插入任意元素和删除“最小”的有效操作。你可能会考虑在这里做这件事。您可以将它们放入按相关性排序的Map而不是PriorityQueue,而最相关的是根。然后,要提取最相关的 K ,您只需从PriorityQueue中弹出 K 元素。

如果您需要类似地图的属性(从StringInteger的映射),那么您可以编写一个内部保留PriorityQueue和{{1 }}。插入时,插入两者;当您删除最小元素时,您会从HashMap弹出,然后告诉您还需要从PriorityQueue中删除哪个元素。这仍然会为您提供日志时间插入和最小删除。