2012-09-16 51 views
1

我正在尋找一種方法來獲得併發映射或類似的鍵值存儲,可以按值排序而不是按鍵排序。java併發映射按值排序

到目前爲止,我在尋找ConcurrentSkipListMap,但我找不到一種方法來按值排序(使用Comparator),因爲compare方法只接收鍵作爲參數。

該映射的鍵爲字符串,值爲整數。我正在尋找的是一種檢索具有最小值(整數)的密鑰的方法。

我也在考慮使用2個地圖,並用Integer鍵和String值創建一個單獨的地圖,這樣我就會按照我想要的整數有一個有序地圖,但是可以有多個整數相同的價值,這可能導致我陷入更多的問題。

「用戶1」=> 3 「用戶2」=> 1 「用戶3」=> 3

排序的列表: 「用戶2」=> 1 「用戶1」=> 3 「user3」=> 3

有沒有辦法做到這一點或任何第三方庫可以做到這一點?

感謝

回答

1

要通過值,你可以有多個「值」爲「關鍵」的映射進行排序,你需要一個MultiMap。由於沒有併發版本,因此需要進行同步。

這並不意味着性能會很差,因爲這取決於您調用此數據結構的頻率。例如它可以加起來1微秒。

+0

您好感謝,但我不認爲我需要多重映射因爲密鑰(字符串) - >值(整數)唯一的,我不能有2個值相同的關鍵,​​但我希望我的地圖按值(整數)排序​​,或者我在想,但這也不能解決地圖反轉,並使用Integer作爲鍵和字符串作爲值,但是這可能導致擁有多個具有相同值的鍵(整數)請參閱我已更新實驗 –

+0

因此,如果您有多個鍵到相同的值,你反轉它,你需要一個MultiMap,因爲現在你有一個鍵有多個值。總之,你只能按鍵進行排序。 –

+0

是的...你是對的,但我希望能夠在某個時候刪除基於密鑰(字符串)的條目。通過反轉地圖,我認爲這會有點難,因爲我必須按價值進行搜索。 –

0

ConcurrentMap的原理是它可以同時訪問 - 如果你想隨時對它進行排序,性能將受到很大影響,因爲該映射需要完全同步(如散列表),導致吞吐量較差。因此,我認爲你最好的選擇是通過將所有元素放在一個不可修改的TreeMap中來返回你的地圖的排序視圖(儘管按值對TreeMap進行排序需要一點調整)。

+0

我的地圖中的值通過添加/刪除鍵或更改值而不斷變化 –

+0

您是否真的需要它隨時排序或者您只需要不時查詢具有最小值的鍵? – assylias

+0

實際上,我只需要不時檢索最小值,我不在乎它是否已排序。有沒有辦法做到這一點,而不解析整個地圖? –

0

我最近不得不這樣做,最後使用ConcurrentSkipListMap這裏的鍵包含一個字符串和一個整數。我最終使用了下面提出的答案。核心洞察力是,您可以構建代碼,以便在刪除前一個密鑰之前允許複製具有不同值的密鑰。

Atomic way to reorder keys in a ConcurrentSkipListMap/ConcurrentSkipListSet?

問題是要保持一個動態的一套用整數,可以從不同的線程同時改變,如下所述相關的字符串。這聽起來與你想要做的非常相似。

Is there an embeddable Java alternative to Redis?

下面是我的實現代碼:

https://github.com/HarvardEconCS/TurkServer/blob/master/turkserver/src/main/java/edu/harvard/econcs/turkserver/util/UserItemMatcher.java