2015-02-07 31 views
2

當我開始將值添加到Set<Integer>時,我得到排序元素。 請參考下面這個例子:爲什麼設置<Integer>正在排序附加值?

Set<Integer> generated = new HashSet<Integer>(); 
generated.add(2); 
generated.add(1); 
generated.add(0); 

在這裏,我得到的排序Set[0, 1, 2]。我想獲得價值,因爲我添加到generated對象。

+0

的可能重複的[這是如何的HashSet產生排序輸出?]( http://stackoverflow.com/questions/18648521/how-is-this-hashset-producing-sorted-output) – Radiodef 2015-02-08 01:25:18

回答

2

A HashSet沒有元素的可預測順序。使用LinkedHashSet來保留元素集合的插入順序:

集合接口的哈希表和鏈接列表實現,具有可預測的迭代順序。

Set<Integer> generated = new LinkedHashSet<Integer>(); 
generated.add(2); 
generated.add(1); 
generated.add(0); 
2

首先,它只是一個共同發病率,你得到排序值第一次。如果您多次運行該代碼,您將以某種隨機順序看到輸出。這是因爲HashSet不會對您添加的元素執行任何排序。

現在,按照插入的順序獲取元素,您可以使用LinkedHashSet來維護插入順序。

2

HashSet不保證元素的順序。從JavaDoc

它對集合的迭代順序不作任何保證;特別是,它不能保證訂單會隨着時間的推移保持不變。

所以,爲了保證訂單a可以使用LinkedHashSet。從JavaDoc

哈希表和Set接口的鏈表實現,具有可預測的迭代順序。

此鏈接列表定義了迭代排序,這是元素插入到集合中的順序(插入順序)。

簡單的實例化你Set這樣的:

Set<Integer> generated = new LinkedHashSet<>(); 
0

首先,關於你的問題的標題,Set<Integer>只是申報類型及其不負責的任何排序/ unsorting行爲,主要使用Set接口的原因是關心唯一性 - 它不允許重複,來自Javadocs:的附加信息

Set是一個不能包含重複元素的集合。

其次,那就是你得到的有序set純concidence,使用HashSet當你不通過它進行遍歷時,從javadocs:

關心順序,更多相關信息它不保證爲集合的迭代次序;在 特別是,它不能保證該訂單隨着時間的推移將保持恆定 。這個類允許null元素。

,關於你在找什麼:

我想,因爲我加入到生成的對象中獲取價值。

,那麼你需要使用LinkedHashSetjavadocs負責其中的元素插入的順序,再次:

此鏈接列表定義在 哪些元素迭代順序,這是爲了被插入到集合(插入順序)中。需要注意的是,如果一個元素重新插入 設置

你可以使用它只是這樣 插入順序不受影響:

Set<Integer> generated = new LinkedHashSet<Integer>(); 

第四個和最後,作爲附加信息,另一個重要的集合,你需要知道它,是TreeSet,它保證元素將按照自然順序升序排序,​​:

的元件使用他們的自然順序進行排序,或者由一 比較集合創建時提供,這取決於所使用 構造

相關問題