我正在使用LinkedHashSet。我想在第0个位置插入项目,如:
Set<String> set = new LinkedHashSet<String>();
for (int i = 0; i < n; i++) {
set.add(0, "blah" + i);
}
我不确定如何实现链接哈希集,是插入物理移动当前项的所有地址,还是与链接列表实现中的插入成本相同?
谢谢
------编辑---------------
我完全陷入困境,引用了ArrayList文档。 Set接口没有add(index,object)方法。有没有办法向后迭代集合呢?现在迭代我正在做:
for (String it : set) {
}
我们可以反过来吗?
由于
答案 0 :(得分:7)
根据定义,集合与顺序无关。因此,Set没有可用的add(int,Object)方法。
LinkedHashSet http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
也是如此LinkedHashSet维护插入顺序,因此所有元素都添加在链表的末尾。这是使用LinkedHashMap实现的。您可以查看LinkedHashMap http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html
中的linkEntry方法编辑:回复已修改的问题
没有可用的API方法。但是您可以执行以下操作
ArrayList(Set)
Collections.reverse(List)
答案 1 :(得分:1)
根据LinkedHashMap的源代码判断(支持LinkedHashSet - 请参阅http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html),插入是便宜的,就像在链表中一样。
答案 2 :(得分:0)
你不能在LinkedHashSet
的前面添加元素......它没有诸如add(int, Object)
之类的方法,也没有任何其他方法可以使用“{1}}的概念” set(这是一个List
概念)。它仅根据插入元素的顺序提供一致的迭代顺序。最近插入的元素不在集合中,将是迭代它时的最后一个元素。
LinkedHashSet
的Javadoc明确指出:
与HashSet一样,它为基本操作(添加,包含和删除)提供了恒定时间性能,假设哈希函数在桶之间正确地分散元素。
编辑:没有任何方法可以迭代LinkedHashSet
,而不是将其复制到List
并反过来迭代。for (String s : Lists.reverse(ImmutableList.copyOf(set))) { ... }
。使用Guava你可以这样做:
ImmutableList
请注意,虽然创建reverse
确实需要迭代原始集的每个元素,但{{1}}方法只提供反向视图,并且不会自行迭代。
答案 3 :(得分:0)
要回答您的最新问题,LinkedHashSet
没有可用的反向迭代器功能,即使内部实现使用双向链接列表。
有一个开放的增强请求:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4848853
Mark Peters链接到番石榴中可用的功能,尽管他们的反向列表实际上会生成一个反向列表。
答案 4 :(得分:0)
如前所述,LinkedHashSet是在LinkedHashMap上构建的,它建立在HashMap上:) Javadocs说,假设你的哈希函数正确实现,它需要花费很长时间才能将元素添加到HashMap中。如果你的哈希函数没有很好地实现,它可能需要达到O(n)。 此时不支持向后迭代。