2014-10-28 50 views
1

根據this question我已下令一個Java Map N個最相關的對象,如下所示:檢索的Java TreeMap中

ValueComparator bvc = new ValueComparator(originalMap); 
Map<String,Integer> sortedMap = new TreeMap<String,Integer>(bvc); 
sortedMap.putAll(originalMap); 

現在,我想從地圖中提取K最相關的值,在頂K時尚。有沒有一種非常有效的方式來做到這一點,而無需迭代地圖?

P.S.,一些類似的問題(例如,this)要求解決最高1的檢索問題。

+1

我強烈建議您不要使用該實現。您是否閱讀過關於最佳答案的評論? http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java#comment4699669_1283722 – 2014-10-28 14:03:27

+0

Ups,沒有注意到它。 – Eleanore 2014-10-28 14:12:10

回答

4

不,如果您使用Map則不行。你必須迭代它。您是否考慮使用PriorityQueue?這是Java的堆實現。它具有插入任意元素和刪除「最小」的高效操作。你可以考慮在這裏做這個。而不是Map,您可以將它們放入按相關性排序的PriorityQueue,並將其作爲最重要的根。然後,要提取最相關的K,您只需從PriorityQueue中彈出K元素。

如果您需要的地圖狀特性(映射從StringInteger),那麼你可以寫一個類內部保存一切既是PriorityQueueHashMap。當你插入時,你插入兩者;當你刪除最小元素時,你從PriorityQueue中彈出,然後告訴你哪個元素還需要從HashMap中刪除。這仍然會給你日誌時間插入和最小清除。

+0

不幸的是,我需要在地圖中保留兩個值(一個字符串和一個整數)。我需要他們兩個。我想過在隊列中放入一個條目,但在這種情況下,操作queue.contains(<具有指定的String鍵的任何元組)很難實現 – Eleanore 2014-10-28 14:18:31

+0

@Eleanore我已經爲關於這個問題。 – 2014-10-28 14:25:28