我应该使用哪种数据结构来支持键值映射,反向迭代和插入排序?

时间:2015-10-13 13:16:17

标签: java collections hashmap treemap linkedhashmap

Collections中的哪个数据结构可以有效地存储键值映射,保留插入顺序并允许高效反向遍历?数据结构必须来自原始Java集合,因此使用Apache Commons库是不可能的。

我目前正在使用LinkedHashMap,这是理想的,因为它保留了插入顺序,允许键值映射,并且具有在O(1)时间内运行的add()和remove()方法。但问题是,为了反转LinkedHashMap,我需要在每次添加新密钥时执行set-copy:

List<Integer> reverseKeys = new ArrayList<>(keys);
Collections.reverse(reverseKeys);

对于大型密钥集而言变得非常昂贵(如此处所述:Iterating through a LinkedHashMap in reverse order)。

或者,我可以使用带有自定义比较器的TreeMap来保留插入顺序,但这似乎是浪费,因为add()和remove()将在O(n)时间内运行。这种方法的好处是TreeMap具有descendingKeySet()方法,该方法允许有效的反向遍历。

我唯一的另一个想法是使用Entry对象的ArrayList,但是我不确定它会有多高效。

这些方法中的哪一种在几千个键值映射中表现最佳?有没有我没有列出的方法会更好?

1 个答案:

答案 0 :(得分:2)

你只需要一个变量吗?如果您想经常查询,那么在不同结构中多次使用相同数据是常见的方法。

添加/删除成本更高,但选择的成本会低很多。

在您的情况下,您可以按相反顺序使用LinkedList(在零位置添加O(1))和LinkedHashMap。

理想情况下,您应该使用这两个变量和方法创建自己的类,例如“添加/删除等”,以确保它是一致的。