Java自然排序Comparable使用方法解析
首先說(shuō)明用TreeSet集合存儲(chǔ)自定義時(shí),無(wú)參構(gòu)造方法使用的是自然排序?qū)υ剡M(jìn)行排序的
然后,使用自然排序的前提是,讓元素所屬的類(lèi)實(shí)現(xiàn)Comparable接口并重寫(xiě)comparaTo(T o)方法,來(lái)完成。
其次要注意,重寫(xiě)方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和條件來(lái)寫(xiě)。 下面通過(guò)一個(gè)需求來(lái)具體實(shí)現(xiàn)一下。
需求:存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用無(wú)參構(gòu)造方法。
要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
分析可知,需要兩個(gè)類(lèi):一個(gè)學(xué)生類(lèi)(Student)一個(gè)操作類(lèi)(TreeSetDemo)學(xué)生類(lèi)中有兩個(gè)成員遍歷:姓名(name)、年齡(age)。(僅記錄重寫(xiě)代碼部分)
操作類(lèi)代碼:
public class TreeSetDemo { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet<Student> treeSet = new TreeSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xishi",29); Student s2 = new Student("wangzhaojun",30); Student s3 = new Student("diaocan",28); Student s4 = new Student("yangyuhuan",31); //添加元素 treeSet.add(s1); treeSet.add(s2); treeSet.add(s3); treeSet.add(s4); //遍歷 for (Student s : treeSet){ System.out.println(s); } } }
接下來(lái)測(cè)試,在學(xué)生類(lèi)中實(shí)現(xiàn)了Comparable<E>接口,并重寫(xiě)compareTo(T o)方法后,操作類(lèi)的運(yùn)行情況
在Student類(lèi)中重寫(xiě)compareTo(T o)方法代碼:(通過(guò)返回值的不同,來(lái)影響排序結(jié)果,具體看運(yùn)行結(jié)果)
@Override public int compareTo(Student o) { return 0; } /* 運(yùn)行結(jié)果:xishi,29 */ @Override public int compareTo(Student o) { return 1; } /* 運(yùn)行結(jié)果: xishi,29 wangzhaojun,30 diaocan,28 yangyuhuan,31 */ @Override public int compareTo(Student o) { return -1; } /* 運(yùn)行結(jié)果: yangyuhuan,31 diaocan,28 wangzhaojun,30 xishi,29 */
通過(guò)三次修改返回值,從運(yùn)行結(jié)果中可以得出結(jié)論:
當(dāng)返回值為0時(shí),認(rèn)為是重復(fù)元素,不進(jìn)行存儲(chǔ)。
當(dāng)返回值為1時(shí),按照存儲(chǔ)順序,正向排序(升序)(因?yàn)槭钦蚺判?,可以理解從小到大的順序?/p>
當(dāng)返回值為-1時(shí),按照存儲(chǔ)順序,逆向排序(降序)(同理)
于是,可以通過(guò)控制返回值的不同來(lái)控制不同的排序結(jié)果。接下來(lái)實(shí)現(xiàn)上面的需求。
對(duì)compareTo方法在進(jìn)行修改,先使得年齡以升序的方式排序,代碼:
@Override public int compareTo(Student s) { int num = this.age - s.age; return num; } /* 運(yùn)行結(jié)果: diaocan,28 xishi,29 wangzhaojun,30 yangyuhuan,31 */
接下來(lái)完善要求,年齡相同時(shí),按照姓名的字母順序排序,完整代碼如下:
//操作類(lèi)代碼 public class TreeSetDemo { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet<Student> treeSet = new TreeSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xishi",29); Student s2 = new Student("wangzhaojun",30); Student s3 = new Student("diaocan",28); Student s4 = new Student("yangyuhuan",31); Student s5 = new Student("linqingxia",31); //添加元素 treeSet.add(s1); treeSet.add(s2); treeSet.add(s3); treeSet.add(s4); treeSet.add(s5); //遍歷 for (Student s : treeSet){ System.out.println(s.getName()+","+s.getAge()); } } } //學(xué)生類(lèi)中重寫(xiě)代碼部分及運(yùn)行結(jié)果 @Override public int compareTo(Student s) { int num = this.age - s.age; //如果年齡相同則比較姓名字母順序(升序)排列。 int num2 = num == 0 ? this.name.compareTo(s.name) : num; return num2; } /* 運(yùn)行結(jié)果: diaocan,28 xishi,29 wangzhaojun,30 linqingxia,31 yangyuhuan,31 */
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot事件監(jiān)聽(tīng)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Springboot插件開(kāi)發(fā)實(shí)戰(zhàn)分享
這篇文章主要介紹了Springboot插件開(kāi)發(fā)實(shí)戰(zhàn)分享,文章通過(guò)新建aop切面執(zhí)行類(lèi)MonitorLogInterceptor展開(kāi)詳細(xì)的相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解
這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例
本篇文章主要介紹了java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10Java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)哈希表的分離鏈接法
今天給大家?guī)?lái)的是關(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文章圍繞著Java哈希表的分離鏈接法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06淺談java實(shí)現(xiàn)redis的發(fā)布訂閱(簡(jiǎn)單易懂)
本篇文章主要介紹了淺談java實(shí)現(xiàn) redis的發(fā)布訂閱(簡(jiǎn)單易懂),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03SpringSecurit鹽值加密的密碼驗(yàn)證以及強(qiáng)密碼驗(yàn)證過(guò)程
在密碼加密過(guò)程中,鹽值的使用可以增強(qiáng)密碼的安全性,如果忘記存儲(chǔ)鹽值,將無(wú)法驗(yàn)證密碼,強(qiáng)密碼應(yīng)包含數(shù)字、字母和特殊字符,長(zhǎng)度應(yīng)在8到30位之間,以提高賬戶安全2023-03-03Spring Integration 實(shí)現(xiàn)消息驅(qū)動(dòng)的詳細(xì)步驟
Spring Integration是一個(gè)用于構(gòu)建消息驅(qū)動(dòng)的中間件輕量級(jí)框架,它提供了一種模型和工具,用于在Spring應(yīng)用程序中實(shí)現(xiàn)企業(yè)集成模式,這篇文章主要介紹了Spring Integration 實(shí)現(xiàn)消息驅(qū)動(dòng),需要的朋友可以參考下2024-05-05