摘要:實體類接口重寫方法,業(yè)務(wù)排序類接口重寫方法這兩個接口我們非常的熟悉,但是在用的時候會有一些不知道怎么下手的感覺,現(xiàn)在用案例進行總結(jié),消除對這個知識點的理解盲區(qū)個人的理解,如果有錯誤請多多指教。
實體類:java.lang.Comparable(接口) + comareTo(重寫方法),業(yè)務(wù)排序類 java.util.Comparator(接口) + compare(重寫方法).
這兩個接口我們非常的熟悉,但是 在用的時候會有一些不知道怎么下手的感覺,現(xiàn)在用案例進行總結(jié),消除對這個知識點的理解盲區(qū)(個人的理解,如果有錯誤 請多多指教)。
一,在實際的需求中,我們需要根據(jù)對象的各種屬性(標題,時間,點擊率,銷售額...)進行排序(升序,降序),可以在數(shù)據(jù)庫的sql上進行處理,但是 不是每一個場景 都適合在sql上進行處理,我們有時候需要在程序根據(jù)不同的屬性,對一個對象進行各種排序 通過頁面呈現(xiàn)給用戶。
下面有這樣的一個需求,一種商品(商品名,銷售量,生產(chǎn)日期),根據(jù)生產(chǎn)日期降序 銷售量升序 商品名稱降序
思路:首先按照日期降序,如果日期相同 按照銷售量升序,如果銷售量相同,按周商品的名稱降序
1,創(chuàng)建需要比較的對象的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; } //時間降序 點擊量升序 標題降序 @Override public int compareTo(Items o) { int result = 0; //按照生產(chǎn)時間降序 result = - this.pubTime.compareTo(o.pubTime); if(0==result){//如果生產(chǎn)時間相同 就按照銷售量升序排列 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)時間").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).append(" "); return sb.toString(); } }
2,造數(shù)據(jù),比較
//時間降序, 銷售量升序, 標題降序 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)用場景
一般比較字符串是按照unicode的大小進行排序的,但是我需要按照字符串的長度進行排序,下面是實現(xiàn)的案例:
首先,定義比較的業(yè)務(wù)規(guī)則
/** * 定義業(yè)務(wù)的比較規(guī)則,我需要按照字符串的長度進行比較(在實際的場景中,可以根據(jù)業(yè)務(wù)的需求,靈活的改變比較規(guī)則,實現(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);//需要按照降序排列 } }
比較 字符串的長度,按照 降序排列
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] }
比如 商品,我需要按照價格的降序排列,代碼如下:
商品 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ī)則:
/** * 按照價格的降序排列 */ 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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64827.html
摘要:有些類是直接實現(xiàn)了接口的,這個時候如果要改寫排序條件,就直接改寫接口的方法有些類不是用接口,而是用了個類,這時候改寫方法接口只有一個方法具體實踐中一般寫作與某個的比較,比如類比較排序時重寫有些類在構(gòu)造時可以加參數(shù),比如,默認是從小到大排序 有些類是直接實現(xiàn)了Comparable接口的,這個時候如果要改寫排序條件,就直接改寫Comparable接口的CompareTo方法 有些類不是用...
摘要:,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。在排序的時候常需要實現(xiàn)這個接口來定制比較規(guī)則。若函數(shù)的返回值大于,那么在排序后會將放在的后面。 Comparator,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。在排序的時候常需要實現(xiàn)這個接口來定制比較規(guī)則。 但是很多人用的時候不清楚該如何使用這個接口,下面我就講一下這個接口的正確使用方法!這個接口里有一個必須實現(xiàn)的...
摘要:與辨析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處比較三種狀態(tài)根據(jù)需求定義序升序降序返回負數(shù),表示比較兩元素滿足序,無須調(diào)整,返回,表示比較兩元素相等,無須調(diào)整位置,返回正數(shù),表示比較兩元素不滿足序,按序調(diào)整位置對象內(nèi)部排序源碼繼承接口的對象必 Comparator與Comparable辨析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處:[1] https://segmentfault.co...
摘要:一內(nèi)部排序接口實現(xiàn)該接口的類,支持自然排序內(nèi)排序。方法與方法不一致。在有序集合看來和是相等的,因此第個鍵無法被添加到集合中。 一、Comparable(內(nèi)部排序接口) 實現(xiàn)該接口的類,支持自然排序(內(nèi)排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對象必須實現(xiàn)Comparable接口 文檔中指出: 如果該對象大于指定對象,返回...
閱讀 1619·2021-11-11 10:59
閱讀 2625·2021-09-04 16:40
閱讀 3650·2021-09-04 16:40
閱讀 2979·2021-07-30 15:30
閱讀 1615·2021-07-26 22:03
閱讀 3164·2019-08-30 13:20
閱讀 2225·2019-08-29 18:31
閱讀 439·2019-08-29 12:21