2010-10-13 58 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)。 此時迭代不支持。

    相關問題