可能重复:
如何在Java中的值进行排序的Map <键,值>?
我需要有序映射像TreeMap的,而是由值排序。 我的地图将是巨大的,所以我不能只是排序我的地图我随时需要。 有什么好的解决方案来解决这个问题呢? 也许存在谁满足了这种外部罐子?
可能重复:
如何在Java中的值进行排序的Map <键,值>?
我需要有序映射像TreeMap的,而是由值排序。 我的地图将是巨大的,所以我不能只是排序我的地图我随时需要。 有什么好的解决方案来解决这个问题呢? 也许存在谁满足了这种外部罐子?
有许多的方式来满足您的要求。 正如你所随后澄清说,你可能在你的当前副本对象TreeMap
,也许你可以取代你的TreeMap
与第三方多重映射 ( 番石榴 , 阿帕奇百科全书集合 ),然后交换你的关键字和值左右-即替代TreeMap<Key, Value>
与Multimap<Value, Key>
。 根据你的情况的细节,我相信这代表了你工作的好机会。
如果您使用的是TreeMap
维持自己价值的指标,即你正在使用它主要是为了快速找到一个给定键的匹配值,你可以做的另一件事是保持2层数据结构:
TreeMap
,你现在正在使用的索引 PriorityQueue
(或其他排序列表)遍历在有序你的价值观 然后,只需添加当你有任何更改删除值两份名单。 对于这一点,你就不会需要保留值的两个副本要么左右。 您只需现在可以添加你有一个副本两份名单,因为仅列出与引用你的价值观工作。
这里根本不存在任何数据结构,可以有效地做到这一点:你必须保持一个数据结构,使得它有效地通过按键来查找和排序的值使之更难以保持这种结构。
如果它的创建后不修改地图,虽然,那么你可以做这样的事情:
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的遍历会在排序的价值秩序。
如果您的数据是唯一的,你可以在其中持有Set
这将是按升序迭代(假设你实现Comparable
)。
然后你把你的Map
分别比不只是抱着原来要额外收费Map
。