2011-05-19 136 views
3
  • 假設列表b是一個LinkedList。
  • 假設List a也是一個LinkedList。

問:將LinkedHashSet轉換爲列表

  • 如何追加,這些名單在不斷的時間?

這是可能的,因爲LinkedList大概是一個雙向鏈表(否則它不能實現Deque接口)。追加雙向鏈表是一個0(1)操作。

addAll方法不會在恆定時間內運行。

問:

  • 如何變換LinkedHashSet成在固定時間列表?

這也可能是因爲LinkedHashSet「維護通過其所有條目運行的雙向鏈接列表」。

回答

5

您的假設是基於沒有封裝 - 即LinkedHashSet願意將其內部LinkedList暴露給外部世界,當我懷疑它不是。

同樣加入兩個鏈接列表 - 我不知道每個節點是否知道它在哪個列表中,但這肯定是一種可能性,它會減少你的常量附加。即使他們不這樣做,只要您將一個列表的頭部附加到另一個列表的尾部,最終會出現問題 - 您有兩個列表都指向相同的數據,這會導致一些奇怪的後果。

換句話說,從計算機科學的角度來看,這兩種操作都是可行的,並且您可以構建自己的實現來支持它們,但這並不意味着Java API會以啓用它的方式公開其內部那些操作。

+0

Java是否已經有追加LinkedList的方法?這些方法當然應該使用LinkedList而不是List,因爲它們根本無法使用ArrayList。將LinkedHashSet轉換爲LinkedList也是如此。實際上,這是我的問題。 – Klems 2011-05-19 16:24:36

+0

@Klems:不,我不相信它 - 因爲你有兩個共享節點的LinkedList對象。同樣,如果調用者修改返回的列表,您將如何建議從LinkedHashSet創建LinkedList而不引入可能的損壞? (我想可能會返回一個不可變的視圖。) – 2011-05-19 16:36:46

+0

哦,我現在看到了問題。那麼,正如你所說,它可能會返回一個只讀列表。這有點像返回一個迭代器。但是,要附加2列表,該方法可以清除2個初始列表並返回結果列表。但我明白你的觀點。 – Klems 2011-05-19 16:45:19

5

你需要實現你自己的類。 LinkedList類不公開其內部節點結構,因此您不能將其最後一個節點指向另一個LinkedList的第一個節點。

答案與LinkedHashSet類似:雖然它確實保留了這個雙向鏈表,但您無法訪問它。

+0

由於LinkedHashSet實現了抽象集合接口,因此您可以訪問該列表。請參閱@Michael McGrady答案 – 2017-10-08 08:39:12

1

你不能訪問它,但我懷疑集合的確如此,所以你不應該放棄希望這是對你的問題可行和快速的解決方案。

我看得更遠,你是對的。如果你有Set<Whatever> whatever = SOME CONSTRUCTOR那麼你可以編碼List<Whatever> list = new LinkedList(whatever);,因爲LinkedList有一個集合構造函數,而集合有一個集合接口。