【发布时间】: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