摘要:實(shí)體類接口重寫(xiě)方法,業(yè)務(wù)排序類接口重寫(xiě)方法這兩個(gè)接口我們非常的熟悉,但是在用的時(shí)候會(huì)有一些不知道怎么下手的感覺(jué),現(xiàn)在用案例進(jìn)行總結(jié),消除對(duì)這個(gè)知識(shí)點(diǎn)的理解盲區(qū)個(gè)人的理解,如果有錯(cuò)誤請(qǐng)多多指教。
實(shí)體類:java.lang.Comparable(接口) + comareTo(重寫(xiě)方法),業(yè)務(wù)排序類 java.util.Comparator(接口) + compare(重寫(xiě)方法).
這兩個(gè)接口我們非常的熟悉,但是 在用的時(shí)候會(huì)有一些不知道怎么下手的感覺(jué),現(xiàn)在用案例進(jìn)行總結(jié),消除對(duì)這個(gè)知識(shí)點(diǎn)的理解盲區(qū)(個(gè)人的理解,如果有錯(cuò)誤 請(qǐng)多多指教)。
一,在實(shí)際的需求中,我們需要根據(jù)對(duì)象的各種屬性(標(biāo)題,時(shí)間,點(diǎn)擊率,銷售額...)進(jìn)行排序(升序,降序),可以在數(shù)據(jù)庫(kù)的sql上進(jìn)行處理,但是 不是每一個(gè)場(chǎng)景 都適合在sql上進(jìn)行處理,我們有時(shí)候需要在程序根據(jù)不同的屬性,對(duì)一個(gè)對(duì)象進(jìn)行各種排序 通過(guò)頁(yè)面呈現(xiàn)給用戶。
下面有這樣的一個(gè)需求,一種商品(商品名,銷售量,生產(chǎn)日期),根據(jù)生產(chǎn)日期降序 銷售量升序 商品名稱降序
思路:首先按照日期降序,如果日期相同 按照銷售量升序,如果銷售量相同,按周商品的名稱降序
1,創(chuàng)建需要比較的對(duì)象的java bean
創(chuàng)建 Bean的快捷鍵:
1),帶參數(shù)的構(gòu)造器:// Shift + Alt + S -->O
2),不帶參數(shù)的構(gòu)造器: //Alt + / 生成空的構(gòu)造方法
3),生成 get set方法:// Shift + Alt + S --> R + Table + Enter + Shift +Table -->Enter
/** * 商品po類 */ public class Items implements java.lang.Comparable{ private String title; private int hits; private Date pubTime; public Items() {} public Items(String title, int hits, Date pubTime) { super(); this.title = title; this.hits = hits; this.pubTime = pubTime; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getHits() { return hits; } public void setHits(int hits) { this.hits = hits; } public Date getPubTime() { return pubTime; } public void setPubTime(Date pubTime) { this.pubTime = pubTime; } //時(shí)間降序 點(diǎn)擊量升序 標(biāo)題降序 @Override public int compareTo(Items o) { int result = 0; //按照生產(chǎn)時(shí)間降序 result = - this.pubTime.compareTo(o.pubTime); if(0==result){//如果生產(chǎn)時(shí)間相同 就按照銷售量升序排列 result = this.hits-o.hits; if(0==result){//如果銷售量相同 按照名字降序排列 result = - this.title.compareTo(o.title); } } return result; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("商品名稱").append(this.title); sb.append("銷售量").append(this.hits); sb.append("生產(chǎn)時(shí)間").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).append(" "); return sb.toString(); } }
2,造數(shù)據(jù),比較
//時(shí)間降序, 銷售量升序, 標(biāo)題降序 public static void main(String[] args) { Listitem = new ArrayList (); item.add(new Items("abcitems" ,30,new Date(System.currentTimeMillis()-1000*60*60))); item.add(new Items("abcfgitems" ,30,new Date(System.currentTimeMillis()-1000*60*50))); item.add(new Items("abcditems" ,100,new Date())); item.add(new Items("abefNews" ,50,new Date(System.currentTimeMillis()-1000*60*60))); System.out.println("----------排序前----------"); System.out.println(item); System.out.println("----------排序后----------"); Collections.sort(item); System.out.println(item); }
二,Comparator的應(yīng)用場(chǎng)景
一般比較字符串是按照unicode的大小進(jìn)行排序的,但是我需要按照字符串的長(zhǎng)度進(jìn)行排序,下面是實(shí)現(xiàn)的案例:
首先,定義比較的業(yè)務(wù)規(guī)則
/** * 定義業(yè)務(wù)的比較規(guī)則,我需要按照字符串的長(zhǎng)度進(jìn)行比較(在實(shí)際的場(chǎng)景中,可以根據(jù)業(yè)務(wù)的需求,靈活的改變比較規(guī)則,實(shí)現(xiàn)排序) */ public class CompareString implements java.util.Comparator{ @Override public int compare(String o1, String o2) { int len1 = o1.length(); int len2 = o2.length(); return -(len1-len2);//需要按照降序排列 } }
比較 字符串的長(zhǎng)度,按照 降序排列
public static void main(String[] args) { Listlist = new ArrayList (); list.add("abc"); list.add("abcd"); list.add("ab"); list.add("abd"); Collections.sort(list,new CompareString()); System.out.println(list); //[abcd, abc, abd, ab] }
比如 商品,我需要按照價(jià)格的降序排列,代碼如下:
商品 po類
/** * 商品po類 */ public class Products { private String title; private int price; public Products() {} public Products(String title, int price) { super(); this.title = title; this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "title=" + title+",price=" + price +" "; } }
定義比較規(guī)則:
/** * 按照價(jià)格的降序排列 */ public class ProductCompare implements java.util.Comparator{ @Override public int compare(Products o1, Products o2) { return -( o1.getPrice()-o2.getPrice()>0?1: (o1.getPrice()==o2.getPrice()?0:-1)); } }
數(shù)據(jù)比較:
public static void main(String[] args) { Listproduct = new ArrayList (); product.add(new Products("a",120)); product.add(new Products("b",143432)); product.add(new Products("c",1892)); product.add(new Products("d",11092)); Collections.sort(product,new ProductCompare()); System.out.println(product); 結(jié)果: [title=b,price=143432 title=d,price=11092 title=c,price=1892 title=a,price=120 ] }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64827.html
摘要:有些類是直接實(shí)現(xiàn)了接口的,這個(gè)時(shí)候如果要改寫(xiě)排序條件,就直接改寫(xiě)接口的方法有些類不是用接口,而是用了個(gè)類,這時(shí)候改寫(xiě)方法接口只有一個(gè)方法具體實(shí)踐中一般寫(xiě)作與某個(gè)的比較,比如類比較排序時(shí)重寫(xiě)有些類在構(gòu)造時(shí)可以加參數(shù),比如,默認(rèn)是從小到大排序 有些類是直接實(shí)現(xiàn)了Comparable接口的,這個(gè)時(shí)候如果要改寫(xiě)排序條件,就直接改寫(xiě)Comparable接口的CompareTo方法 有些類不是用...
摘要:,又名比較器,是為了比較兩個(gè)對(duì)象的大小而抽象出的一個(gè)接口。在排序的時(shí)候常需要實(shí)現(xiàn)這個(gè)接口來(lái)定制比較規(guī)則。若函數(shù)的返回值大于,那么在排序后會(huì)將放在的后面。 Comparator,又名比較器,是為了比較兩個(gè)對(duì)象的大小而抽象出的一個(gè)接口。在排序的時(shí)候常需要實(shí)現(xiàn)這個(gè)接口來(lái)定制比較規(guī)則。 但是很多人用的時(shí)候不清楚該如何使用這個(gè)接口,下面我就講一下這個(gè)接口的正確使用方法!這個(gè)接口里有一個(gè)必須實(shí)現(xiàn)的...
摘要:與辨析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處比較三種狀態(tài)根據(jù)需求定義序升序降序返回負(fù)數(shù),表示比較兩元素滿足序,無(wú)須調(diào)整,返回,表示比較兩元素相等,無(wú)須調(diào)整位置,返回正數(shù),表示比較兩元素不滿足序,按序調(diào)整位置對(duì)象內(nèi)部排序源碼繼承接口的對(duì)象必 Comparator與Comparable辨析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處:[1] https://segmentfault.co...
摘要:一內(nèi)部排序接口實(shí)現(xiàn)該接口的類,支持自然排序內(nèi)排序。方法與方法不一致。在有序集合看來(lái)和是相等的,因此第個(gè)鍵無(wú)法被添加到集合中。 一、Comparable(內(nèi)部排序接口) 實(shí)現(xiàn)該接口的類,支持自然排序(內(nèi)排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對(duì)象必須實(shí)現(xiàn)Comparable接口 文檔中指出: 如果該對(duì)象大于指定對(duì)象,返回...
閱讀 1685·2021-11-11 10:59
閱讀 2692·2021-09-04 16:40
閱讀 3733·2021-09-04 16:40
閱讀 3076·2021-07-30 15:30
閱讀 1815·2021-07-26 22:03
閱讀 3222·2019-08-30 13:20
閱讀 2296·2019-08-29 18:31
閱讀 497·2019-08-29 12:21