2012-05-22 48 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()); 
} 
相关问题