2012-11-22 31 views
5

可能重複:
How to sort a Map<Key, Value> on the values in Java?Java。有序映射值

我需要有序映射像TreeMap的,而是由值排序。我的地圖將會很大,所以我不能隨時按我的需要排列我的地圖。是否存在解決此問題的良好解決方案?也許存在滿足這個的外部罐子?

+0

但是爲什麼? *填充* – st0le

+0

http://stackoverflow.com/questions/5483330/how-do-i-convert-a-hashmap-to-a-list http://stackoverflow.com/questions/2784514/sort - 自定義對象 - 按屬性排列的對象 –

+0

最簡單的解決方案是同時維護您的'TreeMap'和'TreeSet'值。 – Dunes

回答

1

有很多方法可以滿足您的要求。正如你後來澄清說,你可能在你當前的TreeMap中有重複的對象,也許你可以用第三方multimapGuava,Apache Commons Collections)替換你的TreeMap,然後交換你的密鑰和值 - 即替換TreeMap<Key, Value>Multimap<Value, Key>。根據您的具體情況,我相信這是您工作的好機會。

+1

此解決方案可能可以工作,但我不能重複值。 – user1711160

+0

如果您當前的一些地圖值是重複的,則允許將多個值與一個關鍵字相關聯的反向多圖(http://en.wikipedia.org/wiki/Multimap)可能是您需要的。 Google Guava(http://docs.guava-libraries.googlecode.com/git-history/v13.0.1/javadoc/com/google/common/collect/TreeMultimap.html)和Apache Commons Collections(http:// commons.apache.org/collections/api-3.1/org/apache/commons/collections/MultiMap.html)提供了這個數據結構。 –

+0

我已經修改了我的答案,以根據您的改進要求使用多圖。 –

0

如果您使用的是TreeMap來維護自己價值的指標,即你正在使用它主要是爲了快速找到一個給定鍵的匹配值,你可以做的另一件事是保持2層數據結構:

  • TreeMap您現在正在使用的索引
  • 一個PriorityQueue(或其他排序列表)的排序順序遍歷你的價值觀

然後,只需添加和刪除t值o當你有任何改變時,列出這兩個列表。爲此,您將而不是需要保留兩個值的兩個副本。您可以簡單地將現有的一個副本添加到兩個列表中,因爲這些列表僅適用於對值的引用。

0

實際上並不存在任何可以有效執行此操作的數據結構:用於維護一個數據結構,該結構可以通過鍵進行查找,並且對值進行排序會使維護該結構更加困難。

如果不修改地圖的創建完畢後,雖然,那麼你可以做這樣的事情:

List<Map.Entry<Key, Value>> list = new ArrayList<Map.Entry<Key, Value>>(
    map.entrySet()); 
Collections.sort(list, new Comparator<Map.Entry<Key, Value>>() { 
    public int compare(Map.Entry<Key, Value> e1, Map.Entry<Key, Value> e2) { 
    return e1.getValue().compareTo(e2.getValue()); 
    } 
}); 
Map<Key, Value> sortedByValues = new LinkedHashMap<Key, Value>(); 
for (Map.Entry<Key, Value> entry : list) { 
    sortedByValues.put(entry.getKey(), entry.getValue()); 
} 

所得的LinkedHashMap會遍歷以排序價值秩序。

0

如果您的數據是唯一的,您可以將它們保存在Set中,這些數據可以按升序迭代(假設您執行Comparable)。

然後,您可以分別持有Map,而不需要支付原始Map的額外費用。