具有唯一键的对的排序列表的Java结构建议

时间:2012-08-15 09:47:12

标签: java sorting hashmap sortedmap

结构k => vkv>=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]

3 个答案:

答案 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;