结构k => v
(k
和v
为>=0
整数)其中所有k
都是唯一的,v
可能相等({ {1}}和k1 => v
)应按k2 => v
值的升序排序,例如:
我们拥有v
并希望插入新的[35 => 1, 23 => 4, 9 => 9, 2 => 14]
对,结果将是20 => 5
。
Java中最快的结构是什么,我可以使用它来创建基于某些输入数据的结构,并进一步从左侧以“一对一”的方式迭代它。 [35 => 1, 23 => 4, 20 => 5, 9 => 9, 2 => 14]
?
答案 0 :(得分:1)
我认为没有现成的结构。
SortedMap不适合您,因为它使用键而不是值进行排序。
我会使用HashMap并在另一个将entrySet复制到列表中的方法中实现排序。该列表将使用比较值的自定义比较器进行排序。
如果性能是一个很大的重点,那么你应该考虑实现自己的结构。有很多可能做到这一点,人们不能说什么是最快的。这取决于您想要执行的操作频率。
答案 1 :(得分:1)
前段时间我遇到了类似的情况;我并行使用了几张地图:
A HashMap<K, P>
M,其中P是对类型,能够通过其键找到对。
一个TreeMap<P, P>
S,其比较器首先按值排序,然后按键排序,以便始终具有正确的排序顺序。
通过并行维护两个结构,可以始终对您的对进行排序,而无需使用该键作为排序值。
添加一对:
M.put(key, pair);
S.put(pair, pair);
按键获得一对:
M.get(key);
删除一对:
P pair = M.get(key);
M.remove(key);
S.remove(pair);
获取对的排序列表:
S.keySet();
核心业务的平均复杂程度为:
O(logn)
(TreeMap
)O(1)
(HashMap
)O(logn)
(TreeMap
)答案 2 :(得分:1)
如果你不需要增量构建,我会这样做:
List<Pair> pairs = ...;
Collections.sort(pairs, new Comparator<Pair>() {
@Override public int compare(Pair p1, Pair p2) {
return p1.v - p2.v;
}
}
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
map.addAll(pairs); // retains insertion order
return map;