2012-11-22 35 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的额外费用。