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