我需要像TreeMap一样排序地图,但按值排序。我的地图将是巨大的,所以我不能随时对我的地图进行排序。是否存在解决此问题的好方案?也许存在满足这个要求的外部罐子?
答案 0 :(得分:1)
有许多方法可以满足您的要求。正如您随后澄清的那样,您当前TreeMap
可能有重复的对象,也许您可以将您的TreeMap
替换为第三方multimap(Guava,{{3然后交换你的密钥和值 - 即用TreeMap<Key, Value>
替换Multimap<Value, Key>
。根据您的具体情况,我相信这很有可能为您工作。
答案 1 :(得分:0)
如果您使用TreeMap
来维护值的索引,即您主要使用它来快速找到给定键的匹配值,那么您可以做的另一件事就是保留2个数据结构: / p>
TreeMap
PriorityQueue
(或其他排序列表)以按排序顺序迭代您的值然后,只要在有任何更改时添加和删除两个列表中的值。为此,您不需要保留两个值的副本。您只需将现有的一个副本添加到两个列表中,因为列表仅适用于您的值的引用。
答案 2 :(得分: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将按排序的值顺序迭代。
答案 3 :(得分:0)
如果您的数据是唯一的,您可以将它们保存在Set
中,该Comparable
可以按升序进行迭代(假设您实现了Map
)。
然后,您可以单独按住Map
,而无需支付额外费用,而只需持有原始{{1}}。