关于TeMeMAP:按值排序map

Java. Sorted map by value

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to sort a Map on the values in Java?

我需要像treemap一样排序的映射,但按值排序。我的地图会很大,所以我不能在需要的时候对地图进行排序。有没有解决这个问题的好办法?可能有外部罐子谁会遇到这个?


有很多方法可以满足您的需求。正如您随后澄清的那样,您当前的TreeMap中可能有重复的对象,也许您可以用第三方多映射(guava、apache commons集合)替换您的TreeMap,然后交换您的键和值,即用Multimap替换TreeMap。根据你的具体情况,我相信这是为你工作的好机会。


如果您的数据是唯一的,您可以将它们保存在一个Set中,它可以按升序(假设您实现了Comparable)进行迭代。

然后,你可以单独持有你的Map,而不需要额外的费用,而不仅仅是持有原来的Map


实际上没有任何数据结构能够有效地做到这一点:您必须维护一个数据结构,使按键查找更为有效,并且对值进行排序使维护该结构更加困难。

但是,如果在创建地图后不修改它,则可以这样做:

1
2
3
4
5
6
7
8
9
10
11
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将按排序后的值顺序迭代。


如果您使用TreeMap来维护值的索引,即您主要使用它来快速查找给定键的匹配值,那么您可以做的另一件事是保留2个数据结构:

  • 现在用于索引的TreeMap
  • 一个PriorityQueue(或其他排序列表),按排序顺序迭代您的值。

然后,只需在有任何更改时向两个列表添加和删除值。为此,您也不需要保留两个值的副本。您可以简单地将您现在拥有的一个副本添加到两个列表中,因为列表只使用对值的引用。