Java 高效获取LinkedHashSet中最近插入的元素

Java 高效获取LinkedHashSet中最近插入的元素,java,data-structures,hashset,doubly-linked-list,linkedhashset,Java,Data Structures,Hashset,Doubly Linked List,Linkedhashset,根据的Javadoc,它将通过在内部使用双链表来保持插入元素的插入顺序 它维护一个贯穿其所有条目的双链接列表。 此链表定义了迭代顺序,即 哪些元素已插入到集合中(插入顺序) 如果要获取第一个插入的元素,可以使用如下代码: linkedHashSet.iterator().next() 这将给出O(1)中集合中的第一个插入元素 我试图解决一个问题,这要求我访问O(1)中最近插入到集合中的元素,让我们假设不会有任何重复的元素插入到集合中。比如说, linkedHashSet.add(2); //

根据的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中是否有任何方法可以做到这一点,或者我是否需要创建自己的ReverseEditioningLinkedHashSet来做到这一点

基本上,我试图为所有操作找到一个时间复杂度为O(1)的集合数据结构,包括:插入/删除/搜索/检查集合中最近插入的元素。内置的LinkedHashSet似乎非常适合内部进行非常小的修改,但我不确定是否可以使用默认的JDK类API来实现这一点

注: 我检查了JDK的源代码,知道LinkedHashSet是用LinkedHashMap在内部实现的,如果有任何解决方案可以使用LinkedHashMap访问O(1)中最近插入的元素,它对我也很有用


非常感谢。

不幸的是,似乎没有直接/干净的方法来访问O(1)中的
LinkedHashSet
(或
LinkedHashMap
)中最近添加的元素

一种干净的方法是将集合转换为数组并访问最后一个元素,但这将是O(n)


一种肮脏的方式是使用反射来访问内部哈希映射、映射的头部条目,最后是条目的前身(
之前)

谢谢你让我知道这样做的“肮脏方式”,最后我写了我自己的LinkedHashSet变体。@VolodymyrLevytskyi除了你的礼貌之外(称某人为骗子),你应该证明你的主张。迭代时,最近插入的元素是顺序中的最后一个,除非您有自己的实现以相反的方式执行。抱歉!事实上,最近添加的元素位于链表的最前面,是迭代时的最后一个…@VolodymyrLevytskyi我查看了代码(在JDK 6中,但我怀疑有很多更改),这似乎不是真的。
标题
条目始终为空条目,任何新条目都将添加到标题之前。但是,由于列表是双重链接的,除了被引用为
头的元素之外,没有真正的“头”,而且这个引用似乎根本没有改变。变量“头”通过其“after”变量引用第一个插入的元素,通过其“before”变量引用最近添加的元素。每次迭代链表时都会使用变量“header”,因为它的“after”变量引用第一个插入的条目。变量“header”也有其“before”变量,在创建新条目时使用该变量。header.before引用最近插入的条目,以便将未来条目链接到包含链接列表的当前条目。覆盖我的教程,它会变得清晰。我很匆忙,在迭代顺序上犯了一个错误。请阅读我的教程以了解更好的LinkedHashSet,因为后者只是我建议在这里使用LinkedHashMap的公式的包装。因为在插入映射后,您可以通过键快速获得它。无论如何,LinkedHashSet是LinkedHashMap。