在講解set集合排序的幾種方法之前,我們應該先清楚set集合的幾種型別以及特點,才能有效使用起來。set集合的特點
set不允許包含相同的元素,如果試圖把兩個相同元素加入同乙個集合中,add方法返回false。
set判斷兩個物件相同不是使用==運算子,而是根據equals方法。也就是說,只要兩個物件用equals方法比較返回true,set就不會同時接受這兩個物件。
set集合的分類
set集合主要分為3種:
|——sortedset介面——treeset實現類
set介面——|——hashset實現類
|——linkedhashset實現類
hashset的特點是不能保證元素的排列順序,順序有可能發生變化,集合元素可以是null,但只能放入乙個null。因為在hashset中存入乙個元素的時候,會呼叫該物件的hashcode()方法來得到該物件的hashcode值,然後根據 hashcode值來決定該物件在hashset中儲存位置,所以儲存位置是隨機的。hashset就好像是hashmap的key。
treeset是sortedset介面的唯一實現類,treeset可以確保集合元素處於排序狀態。treeset支援兩種排序方式,自然排序 和定製排序,其中自然排序為預設的排序方式。一般的set排序都會使用到treeset。
linkedhashset集合同樣是根據元素的hashcode值來決定元素的儲存位置,但是它同時使用鍊錶維護元素的次序。這樣使得元素看起 來像是以插入順 序儲存的,也就是說,當遍歷該集合時候,linkedhashset將會以元素的新增順序訪問集合的元素。一般的,如果讓你設計乙個快取演算法,linkedhashset就是基本的基礎,利用lru,篩選出應該淘汰的元素。
由於treeset是有元素順序的,因此我們在排序的過程中都會使用treeset。
方法一:傳統方法
public
class
traditionalsetsorttest})
; sortset.
addall
(set)
; system.out.
println
(sortset);}
}------
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果:[
0.40
,1.20
,2.30
,2.40
,3.40
,9.40
]
方法二:lambda表示式
public
class
lambdasetsorttest}--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果:[
0.40
,1.20
,2.30
,2.40
,3.40
,9.40
]
方法三:使用comparator,在jdk1.8以後,comparator有comparator.naturalorder()自然排序這個方法,也有comparator.reverseorder()相反排序的方法。
public
class
comparatorsetsorttest}--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果:[
0.40
,1.20
,2.30
,2.40
,3.40
,9.40
]
方法四:使用stream
這裡使用stream的時候可以轉還成set或者list,轉換成set的時候還需要再建立treeset,如果沒有必須要求是set,其實可以是直接轉換成list,直接就是有序的,更加方便。list list = set.
stream()
.sorted
(comparator.
naturalorder()
).collect
(collectors.
tolist()
);
public
class
streamsetsorttest}--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果:[
0.40
,1.20
,2.30
,2.40
,3.40
,9.40
]
補充:
已知數值a,如果要求向上取值(即尋找順序的set集合中乙個大於等於a的第乙個元素,日常業務還是用到很多的,不到半斤算半斤(含),超過半斤算一斤類似),可以借用set的floor方法,數值超出元素的最大值後會返回null。
如果是bigdecimal型別,treeset集合元素與ceiling引數的小數點位數請務必保持一致。舉例如下:
public
class
setfloormethod}--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果如下:
[0.40
,1.20
,2.30
,2.40
,3.40
,9.40
]根據0.5可以取到元素:1.20
根據2.35可以取到元素:2.40
根據11可以取到元素:null
排序之set集合排序
include include include include using namespace std setdict int main cout 排序之後 iterator it dict.begin it dict.end it cout 公升序排列 include 對於重複的數字將會忽略 in...
set集合方法
集合操作符 集合有四種基礎運算方法,並,交,差,補 s t 並運算,返回乙個新集合,包含在集合s和t中的所有元素 s t 交運算,返回乙個新集合,包含既在s中又在t中的集合 s t 差運算,返回乙個新的集合,包含在集合s中但是不在集合t中的元素 s t 補運算,返回乙個新集合,包含集合s和t中的不相...
set集合的排序
在hibernate的onetomany的實體關聯的時候,one端的set是無序的,可是需要按照順序來搞的話就比較麻煩了。下面給出乙個例子。setdiarypictureset growthdiary.getdiarypictures listdiarypicturelist new arrayli...