使用TreeSet 實現(xiàn) 自定義對象去重 且排序

項目里有一個取數(shù)據(jù)的算法巫玻,返回List<Vo>這樣的集合祠汇,返回的集合要求沒有重復的對象且按發(fā)布時間做排序。
第一時間想到TreeSet這個數(shù)據(jù)結構诗力。

一我抠、對自定義對象去重

重寫自定義對象的equals 和 hashCode方法

SUN官方的文檔中規(guī)定

如果重定義equals方法,就必須重定義hashCode方法,以便用戶可以將對象插入到散列(哈希)表中

那么 SUN 公司是出于什么考慮做了這個規(guī)定呢瓣窄?
在集合框架中的HashSet纳鼎,HashTable和HashMap
都使用哈希表的形式存儲數(shù)據(jù)裳凸,而hashCode計算出來的哈希碼便是它們的身份證登舞。

哈希碼的存在便可以:

  • 1.快速定位對象悬荣,提高哈希表集合的性能。
  • 2.只有當哈希表中對象的索引即hashCode和對象的屬性即equals同時相等時践叠,才能夠判斷兩個對象相等嚼蚀。
  • 3.從上面可以看出,哈希碼主要是為哈希表服務的弄捕,其實如果不需要使用哈希表导帝,也可以不重寫hashCode。
  • 4.但是SUN公司應該是出于對程序擴展性的考慮(萬一以后需要將對象放入哈希表集合中)斋荞,才會規(guī)定重寫equals的同時需要重寫hashCode虐秦,以避免后續(xù)開發(fā)不必要的麻煩。

重寫equals的注意事項

Java語言規(guī)范要求equals需要具有如下的特性:

自反性:對于任何非空引用 x蜈彼,x.equals()應該返回true俺驶。
對稱性:對于任何引用 x 和 y,當且僅當y.equals(x)返回true秉颗,x.equals(y)也應該返回true送矩。
傳遞性:對于任何引用 x、y 和 z菇怀,如果x.equals(y)返回true,y.equals(z)
也應返回同樣的結果爱沟。
一致性:如果 x 和 y 引用的對象沒有發(fā)生變化,反復調用x.equals(y)
應該返回同樣的結果身冀。
對于任意非空引用 x括享,x.equals(null) 應該返回false。

更多詳細的說明請參考
Java 重寫 equals 與 hashCode 的注意事項

這里我需要以主鍵文章ID為準來去重剩愧,對TopicVO對象復寫hashCode和 equals方法:

@Override
public int hashCode()
{
    return topicId.hashCode();
}

 @Override
  public boolean equals(Object obj) {
         if(obj instanceof TopicVo) {
             TopicVo vo = (TopicVo) obj;
               return (vo.getTopicId().equals(this.getTopicId()));
        }
         return super.equals(obj);
  }

二仁卷、對自定義對象排序

復寫 compareTo方法犬第,復寫規(guī)則如下:

1.返回 1 那么當前的值會排在 被比較者 后面。
2.返回 0 那么當前的值【不會被加入到 TreeSet 中】充包,因為當前的值【被認為 是跟現(xiàn)有的某一個值相等】遥椿。
3.返回 -1 會被添加到 被比較者 的前邊淆储。

代碼:

   @Override
public int compareTo(Object obj) {
    // TODO Auto-generated method stub
    TopicVo o = (TopicVo) obj;
    // 按照時間進行降序排列
    if (this.getAuditAt().before(o.getAuditAt())) {
        return 1;
    }
    if (this.getAuditAt().equals(o.getAuditAt()) && this.getTopicId().equals(o.getTopicId())) {
        return 0;
    }
    return -1;
}

這里注意返回0的情況,有可能兩條記錄有同樣的時間數(shù)據(jù)本砰,因為要加上唯一標識TopicId也相等才能說明是同一條記錄,不然有可能會丟失數(shù)據(jù)舔株。

使用時直接把自定義對象TopicVo丟進去 TreeSet<TopicVo> 里就可以實現(xiàn)自動排序和去重了还棱,這樣子程序只需要專注于按照業(yè)務規(guī)則取數(shù)據(jù)就行了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末珍手,一起剝皮案震驚了整個濱河市辞做,隨后出現(xiàn)的幾起案子秤茅,更是在濱河造成了極大的恐慌,老刑警劉巖框喳,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帖努,死亡現(xiàn)場離奇詭異粪般,居然都是意外死亡,警方通過查閱死者的電腦和手機匙监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門亭姥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人达罗,你說我怎么就攤上這事静秆。” “怎么了扶认?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵辐宾,是天一觀的道長膨蛮。 經(jīng)常有香客問我,道長敞葛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任冒窍,我火速辦了婚禮,結果婚禮上款慨,老公的妹妹穿的比我還像新娘。我一直安慰自己谬莹,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布埠戳。 她就那樣靜靜地躺著蕉扮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屁使。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天蛮寂,我揣著相機與錄音酬蹋,去河邊找鬼抽莱。 笑死范抓,一個胖子當著我的面吹牛尉咕,可吹牛的內容都是我干的璃岳。 我是一名探鬼主播铃慷,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蜕该,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堂淡?” 一聲冷哼從身側響起扒腕,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瘾腰,失蹤者是張志新(化名)和其女友劉穎覆履,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硝全,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡伟众,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年凳厢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片数初。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖车摄,靈堂內的尸體忽然破棺而出仑鸥,到底是詐尸還是另有隱情,我是刑警寧澤意狠,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布疮胖,位于F島的核電站,受9級特大地震影響澎灸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拦止,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一汹族、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顶瞒,春花似錦、人聲如沸搁拙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盐茎。三九已至,卻和暖如春字柠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钦幔。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工常柄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人西潘。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像相种,于是被迫代替她去往敵國和親品姓。 傳聞我的和親對象是個殘疾皇子寝并,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容