【发布时间】:2013-07-25 09:01:15
【问题描述】:
根据LinkedHashSet的Javadoc,内部会使用双向链表来保持插入元素的插入顺序。
它维护一个双向链表,贯穿其所有条目。 这个链表定义了迭代顺序,也就是在 哪些元素被插入到集合中(插入顺序)
如果我想获取第一个插入的元素,我可以使用如下代码:
linkedHashSet.iterator().next()
这将为我提供 O(1) 中集合中的第一个插入元素。
我正在尝试解决一个问题,这需要我在 O(1) 中访问集合中最近插入的元素,并且假设不会有任何重复的元素插入集合中。例如,
linkedHashSet.add(2); // the most recent inserted element in the set is 2
linkedHashSet.add(3); // the most recent inserted element in the set is 3
linkedHashSet.add(5); // the most recent inserted element in the set is 5
linkedHashSet.remove(5); // the most recent inserted element in the set is 3 because 5 is removed and not in the set now
由于它是集合中的双向链表,最近的元素似乎应该是双向链表中的最后一个元素,如果有一些 API 可以在 O(1) 内访问它.
我的问题是:JDK 中有什么方法可以做到这一点,还是我需要创建自己的 ReversedIteratingLinkedHashSet 来做到这一点?
基本上,我尝试为所有操作找到具有 O(1) 时间复杂度的 Set 数据结构,包括:插入/删除/搜索/检查集合中最近插入的元素。内置的 LinkedHashSet 似乎很适合在内部进行非常小的修改,但我不确定这是否可以使用默认的 JDK 类 API 来完成。
注意: 我查看了 JDK 的源代码,知道 LinkedHashSet 在内部是用 LinkedHashMap 实现的,如果有任何解决方案可以使用 LinkedHashMap 来访问 O(1) 中最近插入的元素,它对我也很有用。
非常感谢。
【问题讨论】:
-
请覆盖我的教程Internal life of LinkedHashMap 以更好地了解 LinkedHashSet,因为后者只是前者的包装
-
我建议在这里使用 LinkedHashMap。因为在插入一个映射之后,你可以通过按键非常快速地得到它。反正 LinkedHashSet 就是 LinkedHashMap。
标签: java data-structures hashset doubly-linked-list linkedhashset