Java的。 按值排序地图
可能重复:
如何在Java中的值上对Map 进行排序?
我需要像TreeMap这样排序的地图,但按值排序。 我的地图将是巨大的,所以我不能随时对我的地图进行排序。 是否存在解决此问题的良好解决方案? 也许存在符合此要求的外部jar子?
有许多方法可以满足您的要求。 正如您随后澄清的那样,您当前的TreeMap
可能有重复的对象,也许您可以用第三方多图 ( Guava , Apache Commons Collections )替换您的TreeMap
,然后交换您的键和值 – 即替换TreeMap
使用Multimap
。 根据您的具体情况,我相信这很有可能为您工作。
如果您使用TreeMap
来维护值的索引,即您主要使用它来快速查找给定键的匹配值,那么您可以做的另一件事就是保留2个数据结构:
- 您正在使用的
TreeMap
用于索引 -
PriorityQueue
(或其他排序列表),按排序顺序迭代您的值
然后,只要在有任何更改时添加和删除两个列表中的值。 为此,您不需要保留两个值的副本。 您只需将现有的一个副本添加到两个列表中,因为列表仅适用于对值的引用。
实际上并不存在可以有效地执行此操作的任何数据结构:您必须维护一个数据结构,使其能够通过键进行查找,并且对值进行排序会使维护该结构变得更加困难。
但是,如果您在创建地图后没有修改地图,那么您可以执行以下操作:
List> list = new ArrayList>( map.entrySet()); Collections.sort(list, new Comparator>() { public int compare(Map.Entry e1, Map.Entry e2) { return e1.getValue().compareTo(e2.getValue()); } }); Map sortedByValues = new LinkedHashMap(); for (Map.Entry entry : list) { sortedByValues.put(entry.getKey(), entry.getValue()); }
生成的LinkedHashMap将按排序的值顺序迭代。
如果您的数据是唯一的,您可以将它们保存在Set
,该Set
可以按升序迭代(假设您实现了Comparable
)。
然后,您可以单独保留Map
而不需要花费额外费用而只需持有原始Map
。