Set排序方法

2021-09-19 12:17:22 字數 3990 閱讀 6149

在講解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...