使用O(n logn)复杂性按值对java HashMap排序

使用O(n logn)复杂性按值对java HashMap排序,java,collections,hashmap,Java,Collections,Hashmap,我知道这个问题已经被问过很多次了。但几乎所有解的计算复杂度都是O(n^2) 我正在寻找一个O(n logn)复杂度的解决方案。有人能推荐一下吗 谢谢你,好几堆, 柴坦尼亚将条目复制到列表,按值对列表排序;复制回LinkedHashMap。我认为甚至不可能有更好的解决方案 List<Entry<K, V>> entries = new ArrayList<Entry<K, V>>(map.entrySet()); Collections.sort(e

我知道这个问题已经被问过很多次了。但几乎所有解的计算复杂度都是O(n^2)

我正在寻找一个O(n logn)复杂度的解决方案。有人能推荐一下吗

谢谢你,好几堆,
柴坦尼亚

将条目复制到
列表
,按值对
列表
排序;复制回
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());
}
List entries=newarraylist(map.entrySet());
Collections.sort(条目,新的Comparator(){
公共整数比较(左项,右项){
返回left.getValue().compareTo(right.getValue());
}
}
Map sortedMap=newlinkedhashmap(entries.size());
对于(条目:条目){
sortedMap.put(entry.getKey(),entry.getValue());
}

将条目复制到
列表
,按值对
列表
进行排序;复制回
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());
}
List entries=newarraylist(map.entrySet());
Collections.sort(条目,新的Comparator(){
公共整数比较(左项,右项){
返回left.getValue().compareTo(right.getValue());
}
}
Map sortedMap=newlinkedhashmap(entries.size());
对于(条目:条目){
sortedMap.put(entry.getKey(),entry.getValue());
}

可能重复且答案复杂,为什么不使用树形图?编辑-这也是noMAD链接的问题中的建议。对@noMAD链接的问题的答案有几个关键缺陷(如对该答案的评论所示)。特别是,如果多个键映射到同一个值,则会出现问题。如果对不在源映射中的键调用
map.get(key)
,则会出现几乎不可预测的异常,并导致堆栈跟踪混乱。该解决方案是如何实现的
O(n)
?此外,如果背景映射更改了值,则
树状图
可能会损坏,因此当您调用
get
时,
entrySet
中出现的条目将不会出现。呃。我看到太多人尝试
树状图
方法,只是为了以后受到伤害。请避免它。你说的“几乎所有人”是什么意思解决方案的计算复杂度为O(n^2)'?所有最常见的排序算法的复杂度都为O(n log(n))。除非您听说过的唯一解决方案是气泡排序,您应该在完成CS101赋值后立即将其忘记。可能重复,并且答案为
O(n)
complexity为什么不使用树形图?编辑-这也是noMAD链接的问题中的建议。@noMAD链接的问题的答案有几个关键缺陷(如对该答案的评论中所建议的)。特别是,如果多个键映射到同一个值,事情就会破裂。如果调用
map.get(键)
在一个不在源代码映射中的键上,您将获得几乎不可预测的异常,并产生混乱的堆栈跟踪。该解决方案是如何实现的呢
O(n)
?此外,如果背景映射更改了值,则
树状图
可能会损坏,因此当您调用
get
时,
entrySet
中出现的条目将不会出现。呃。我看到太多人尝试
树状图
方法,只是为了以后受到伤害。请避免它。你说的“几乎所有人”是什么意思解决方案的计算复杂度为O(n^2)“?所有最常见的排序算法的复杂度都为O(n log(n))。除非您听说过唯一的解决方案是气泡排序,完成CS101作业后,您应该立即忘记气泡排序。