2010-10-13 329 views
0

我正在使用LinkedHashSet。我想插入第0位的项目,如:在LinkedHashSet的第0个位置插入元素的代价?

Set<String> set = new LinkedHashSet<String>(); 
for (int i = 0; i < n; i++) { 
    set.add(0, "blah" + i); 
} 

我不知道链接哈希集合是如何实现的,是将要实际移动当前项目的所有地址,或者是相同的成本插入在链接列表实现?

谢谢

------编辑---------------

完全搞乱了由我,被引用ArrayList的文档。 Set接口没有添加(索引,对象)方法。有没有办法向后迭代集合呢?现在迭代我在做:

for (String it : set) { 
} 

我们可以做到相反吗?

由于

+2

你从哪里找到LinkedHashSet的add(int,Object)方法? – 2010-10-13 19:45:36

+0

啊对不起刚刚更新的帖子,真的搞砸了一个.. – user291701 2010-10-13 19:46:43

+0

反向?看起来API中的任何内容都不会帮助你。 – 2010-10-13 19:51:34

回答

7

根据定义,集是独立于顺序的。因此,Set没有可用的add(int,Object)方法。

这也是LinkedHashSet http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html的真

LinkedHashSet保持插入顺序,因此所有的元素都在链表的末尾。这是使用LinkedHashMap实现的。你可以看看该方法linkEntry在LinkedHashMap的http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html

编辑:响应于编辑的问题

没有可用做这个API方法。但是你可以做使用新ArrayList(Set)

  • 使用Collections.reverse(List)
  • 迭代这个列表中的下列

    1. 添加集到一个列表
  • 1

    通过LinkedHashMap的源代码判断(它备份LinkedHashSet - 见http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html),插入件是便宜的,像一个链表。

    +0

    这个答案有误导性。插入物的确很便宜。但是对于原始问题,没有办法将链接的哈希集对象的链接列表方面的“头部”插入到“尾部”。 – Kevin 2013-01-30 23:14:59

    0

    您不能添加元素的LinkedHashSet的前...它没有任何方法,如add(int, Object)也没有任何其他方法,使使用“指数”的概念,在集合(这是一个List概念) 。它仅基于插入元素的顺序提供一致的迭代顺序。当您迭代它时,最近插入的元素不会在集合中成为最后一个元素。

    而对于LinkedHashSet的Javadoc明确规定:

    像HashSet的,它提供了基本的操作稳定的性能(增加,包含和删除),假定哈希函数将分散的桶中正确的元素。

    编辑:没有任何方式反向短的类似的东西复制到List和迭代,在反向遍历一个LinkedHashSet。使用Guava你能做到这一点,如:

    for (String s : Lists.reverse(ImmutableList.copyOf(set))) { ... } 
    

    注意,在创建ImmutableList确实需要在原设定的每一个元素迭代,该reverse方法只是提供一个反向视图,并在所有本身不重复。

    0

    要回答您的最新问题,即使内部实现使用双向链接列表,也不存在可从LinkedHashSet获得的反向迭代器功能。

    有一个开放的要求对于增强这一点:

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4848853

    马克彼得斯链接到番石榴提供的功能,但其反向列表实际上产生一个反向列表。

    0

    如前所述,LinkedHashSet是建立在LinkedHashMap的,这是建在HashMap上:) Javadocs说,假设你的哈希函数被正确实现,需要花费不变的时间向HashMap中添加一个元素。如果你的散列函数执行得不好,它可能会占用O(n)。 此时迭代不支持。