關於set集合的排序問題

2021-09-12 10:31:15 字數 2217 閱讀 6638

1.set集合

set集合是一種不包含重複元素的collection,set集合中主要有兩個類:hashset類和treeset類。一般情況我們使用hashset比較多。因為set集合預設是無序的。當我們想要對set集合進行排序時,會使用到treeset。

2.hashset的使用及遍歷

/**

* @program:

* @description

* @author:mr.jia

* @return:

* @creattime:2019-03-11 21:55:50

**/public class testset

system.out.println("");

//增強for循壞遍歷

for (string string:set)}}

輸出結果如下

當然set是不允許存放重複元素的,當我再一次新增乙個「a」進入再輸出set時

輸出結果仍然為乙個a。

這裡我們在set中存放的是乙個string型別的字串,當我們存放的是我們的自定義類時,需要在類中重寫equals方法和hashcode方法。(簡單說一下為什麼重寫equals必須重寫hashcode方法,是因為重寫equals時,我們會對該類中的某些屬性進行判斷。而為了保證equals一致hashcode也一致,故需要重寫hashcode方法)

@override

public boolean equals(object o)

@override

public int hashcode()

這裡我重寫了equals方法,其中對student類中的id進行了比較,當這兩個類的id是相同的時候,equals便返回true。而如果我們沒有重寫hashcode方法,則會出現hashcode不一致而equals一致的情況。(因為沒重寫hashcode實際上是這兩個物件在jvm記憶體堆上的位址,兩個物件的位址肯定不同)

因為往hashset中存放元素時,缺省會對兩個元素進行比較,首先會比較它們的hashcode,當hashcode相同時,再進行equals比較,如果返回true則證明兩個元素相同,將不對該元素進行存放,如果是false,則會進行雜湊,然後存放。

3.treeset的排序

建立方法也是通過new關鍵字進行建立。與hashset的極大不同是,你可以對treeset的元素進行排序。

排序分為自然排序與指定排序。

這裡set1自動對集合內元素進行了公升序排序。

這裡我定義了乙個類實現comparator介面,其中定義了以降序的方式對set1中的元素進行排序。

那麼如果是我們自定義的乙個型別呢?

這裡我定義乙個student類:

再寫乙個類實現comparator介面,以id進行排序。

輸出結果如下

這裡以id進行了降序排列。

主要是為了讓自己鞏固一下treeset。

參考部落格:

set集合的排序

在hibernate的onetomany的實體關聯的時候,one端的set是無序的,可是需要按照順序來搞的話就比較麻煩了。下面給出乙個例子。setdiarypictureset growthdiary.getdiarypictures listdiarypicturelist new arrayli...

Set集合的排序

treeset使用元素的自然順序對元素進行排序,或者根據建立set時提供的comparator進行排序,具體取決於使用的構造方法。通俗一點來說,就是可以按照排序後的列表顯示,也可以按照指定的規則排序。setset new treeset set.add f set.add a set.add b s...

排序之set集合排序

include include include include using namespace std setdict int main cout 排序之後 iterator it dict.begin it dict.end it cout 公升序排列 include 對於重複的數字將會忽略 in...