2012-05-25 109 views
86

Java集保留順序嗎?一個方法正在返回一個Set給我,並假定數據是有序的,但迭代Set,數據是無序的。有沒有更好的方法來管理?該方法是否需要更改以返回Set以外的其他內容?Java設置保留順序?

+1

」的元素沒有特定的順序返回(除非該集是一些類,它提供了保證的一個實例)「。是一個集合的迭代器方法所說的。發現[here](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Set.html) – keyser

回答

140

Set接口不提供任何訂購保證。

它的子接口SortedSet表示一個按照某種標準排序的集合。在Java 6中,有兩個標準容器實現SortedSet。他們是TreeSetConcurrentSkipListSet

除了SortedSet接口之外,還有LinkedHashSet類。它會記住元素插入到集合中的順序,並按照該順序返回其元素。

+14

此外,由於Java 8中[不同的字符串哈希](http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/10361),集合中的默認(未排序)排序地圖將會改變。如果您依賴未排序的排序,您的代碼將在Java 8下表現不同。 – rustyx

50

LinkedHashSet是你需要的。

+39

一個'List'不是'Set'(它不保證會員的獨特性)。 –

+3

在許多商業獨特的情況下,列表不能用於保留訂單而不是集合。 LinkedHashSet維護訂單並存儲唯一。 – gubs

8

設置只是一個接口。爲了保留順序,您必須使用該接口和子接口SortedSet的特定實現,例如TreeSet或LinkedHashSet。你可以用你的設置是這樣的:

Set myOrderedSet = new LinkedHashSet(mySet); 
3

從Javadoc文檔Set.iterator()

返回在此set的元素的迭代器。這些元素以特定的順序返回(除非這個集合是某個提供擔保的類的實例)。

而且,正如已經shuuchan說,一個TreeSet是有保證的順序的Set系統的實現:

的元素使用其自然順序進行排序,或者由集合創建提供了一個比較時間,取決於使用哪個構造函數。

3

通常設置不守秩序,如HashSet的,以便快速找到emelent,但你可以嘗試LinkedHashSet它會保持你放的順序。

0

Set接口本身並沒有規定任何特定的順序。然而,SortedSet確實如此。

7

要保留訂單,請使用ListLinkedHashSet

+1

它是'LinkedHashSet',而不是'Map'。 –

+0

哎呀...感謝您的發現。 – JHS

-1

只有SortedSet可以做的Set

+0

問題是關於保留插入順序(恰好排序)。 – assylias

+0

TreeSet怎麼樣? – Danielson

2

排序以下是可用的標準Set實現的順序特徵在Java中的快速摘要:

  1. 保持插入順序: LinkedHashSetCopyOnWriteArraySet(線程安全)
  2. 保持排序集內的項目:TreeSet,EnumSet(專用於enum S)和ConcurrentSkipListSet(線程安全的)
  3. 不保留任何特定順序的項目:HashSet(在你嘗試過一個)

針對您的特殊情況下,您可以將項目先進行排序,然後使用1或2中的任何一個(最可能是LinkedHashSetTreeSet)。或者,更有效率,您可以將未排序的數據添加到TreeSet,這將自動爲您處理排序。

9

由於許多成員建議使用LinkedHashSet來保留集合的順序。你可以使用這個實現來包裝你的設置。

SortedSet實現可用於排序順序,但爲了您的目的使用LinkedHashSet

從文檔

此外,

「這個實現由HashSet的提供,而不會引起與TreeSet的相關成本增加的指定,通常雜亂無章的排序可以讓客戶,它可以用來產生一組副本具有相同的順序作爲原始,無論原來設定的實施:「

來源:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html