【问题标题】:Which data structure should I use to support key-value mappings, reverse iteration and insertion ordering?我应该使用哪种数据结构来支持键值映射、反向迭代和插入排序?
【发布时间】:2015-10-13 13:16:16
【问题描述】:

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

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

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,但是我不确定这会有多高效。

在几千个键值映射中,这些方法中哪一种总体上表现最好?有没有我没有列出的更好的替代方法?

【问题讨论】:

  • TreeMap 将是我的方法。几千个条目相对较小,我不会担心添加/删除的 O(n) 性能。

标签: java collections hashmap treemap linkedhashmap


【解决方案1】:

你必须只有一个变量吗?如果您想经常查询它们,常见的方法是在不同的结构中多次获取相同的数据。

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

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

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

【讨论】:

  • 只是为了补充这个答案,然后您可以将它们都包装在一个新的数据结构中,该结构将通过一个通用接口完成拥有和更新两者的繁琐工作。
  • 它看起来不是很优雅,但它确实完成了工作并满足了我的效率要求。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多