根据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)中最新插入的元素,那么它对我也很有用。
非常感谢。
答案 0 :(得分:2)
不幸的是,似乎没有直接/干净的方式来访问O(1)中LinkedHashSet
(或LinkedHashMap
)中最近添加的元素。
一种干净的方法是将集合转换为数组并访问最后一个元素,但这将是O(n)。
一种肮脏的方式是使用反射来访问内部哈希映射,地图的头条目,最后是条目的前身(before
)。