2012-05-22 103 views
1

我知道這個問題已被詢問並回答了很多次。但幾乎所有的解決方案的計算複雜度爲O(n^2)。通過使用O(n log n)複雜度對值進行排序java HashMap複雜度

我正在尋找O(n log n)複雜度的解決方案。有人可以建議嗎?

由於堆, 切塔尼亞

+0

可能重複http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java這與'噢答案( n)'複雜度 – noMAD

+0

爲什麼不使用TreeMap?編輯 - 這也是noMAD鏈接問題中的建議。 – rob

+2

@noMAD關聯的問題的答案有幾個嚴重的缺陷(正如對該答案的評論中所建議的那樣)。特別是,如果幾個鍵映射到相同的值,事情將_break._如果您調用'map.get(key)'而不是源映射中的鍵,那麼堆棧跟蹤混亂將導致幾乎不可預知的異常。那麼解決方案'O(n)'怎麼樣? –

回答

3

複製的條目到List,排序List由值;複製回LinkedHashMap。我認爲一個更好的解決方案甚至是不可能的。

List<Entry<K, V>> entries = new ArrayList<Entry<K, V>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Entry<K, V>>() { 
    public int compare(Entry<K, V> left, Entry<K, V> right) { 
    return left.getValue().compareTo(right.getValue()); 
    } 
} 
Map<K, V> sortedMap = new LinkedHashMap<K, V>(entries.size()); 
for (Entry<K, V> entry : entries) { 
    sortedMap.put(entry.getKey(), entry.getValue()); 
} 
相關問題