在實際應用中,咱們每每有須要比較兩個自定義對象大小的地方。而這些自定義對象的比較,就不像簡單的整型數據那麼簡單,它們每每包含有許多的屬性,咱們通常都是根據這些屬性對自定義對象進行比較的。因此Java中要比較對象的大小或者要對對象的集合進行排序,須要經過比較這些對象的某些屬性的大小來肯定它們之間的大小關係。java
通常,Java中經過接口實現兩個對象的比較,比較經常使用就是Comparable接口和Comparator接口。首先類要實現接口,而且使用泛型規定要進行比較的對象所屬的類,而後類實現了接口後,還須要實現接口定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入須要比較大小的另外一個對象,經過選定的成員變量與之比較,若是大於則返回1,小於返回-1,相等返回0。算法
1、Comparable接口數組
1.什麼是Comparable接口ide
此接口強行對實現它的每一個類的對象進行總體排序。此排序被稱爲該類的天然排序 ,類的 compareTo方法被稱爲它的天然比較方法 。實現此接口的對象列表(和數組)能夠經過 Collections.sort(和 Arrays.sort )進行自動排序。實現此接口的對象能夠用做有序映射表中的鍵或有序集合中的元素,無需指定比較器。 測試
2.實現什麼方法ui
int compareTo(T o)this
比較此對象與指定對象的順序。若是該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。
參數: o - 要比較的對象。 spa
返回:負整數、零或正整數,根據此對象是小於、等於仍是大於指定對象。設計
拋出:ClassCastException - 若是指定對象的類型不容許它與此對象進行比較。code
3.實例
package com.mxl.algorithlm; import java.util.Date; /** * 由於要實現對ConsumInfo對象的排序,因此在ConsunInfo類中要實現Comparable接口,也就是要實現compareTo()方法 * 具體的比較參照:依次按照price、uid進行倒序排序 * @author breeze * */ public class ConsumInfo implements Comparable<ConsumInfo> { private int uid; private String name; private double price; private Date datetime; public ConsumInfo() { // TODO Auto-generated constructor stub } public ConsumInfo(int uid,String name,double price,Date datetime){ this.uid = uid; this.name = name; this.price = price; this.datetime = datetime; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getDatetime() { return datetime; } public void setDatetime(Date datetime) { this.datetime = datetime; } @Override public String toString() { return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price + ", datetime=" + datetime + "]"; } /** * 這裏比較的是什麼, Collections.sort方法實現的就是按照此比較的東西排列 * 順序(從小到大): * if(price < o.price){ return -1; } if(price > o.price){ return 1; } * 倒序(從大到小): * if(price < o.price){ return 1; } if(price > o.price){ return -1; } * */ @Override public int compareTo(ConsumInfo o) { //首先比較price,若是price相同,則比較uid if(price < o.price){ return -1; } if(price > o.price){ return 1; } if(price == o.price){ if(uid < o.uid){ return -1; } if(uid > o.uid){ return 1; } } return 0; } } //測試類 package com.mxl.algorithlm; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; public class ConsumInfoTest { public static void main(String[] args) { ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date()); ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date()); ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date()); ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date()); ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date()); ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date()); ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date()); ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date()); List<ConsumInfo> list = new ArrayList<ConsumInfo>(); list.add(consumInfo1); list.add(consumInfo2); list.add(consumInfo3); list.add(consumInfo4); list.add(consumInfo5); list.add(consumInfo6); list.add(consumInfo7); list.add(consumInfo8); System.out.println("排序前:"); //排序前 for(ConsumInfo consumInfo : list ){ System.out.println(consumInfo); } Collections.sort(list);//排序 System.out.println("排序後:"); //排序後 for(ConsumInfo consumInfo :list){ System.out.println(consumInfo); } } }
2、Comparator接口
與上面的Comparable接口不一樣的是:
①、Comparator位於包java.util下,而Comparable位於包java.lang下。
②、Comparable接口將比較代碼嵌入須要進行比較的類的自身代碼中,而Comparator接口在一個獨立的類中實現比較。
③、若是前期類的設計沒有考慮到類的Compare問題而沒有實現Comparable接口,後期能夠經過Comparator接口來實現比較算法進行排序,而且爲了使用不一樣的排序標準作準備,好比:升序、降序。
④、Comparable接口強制進行天然排序,而Comparator接口不強制進行天然排序,能夠指定排序順序。
使用實例:
package test; import java.util.Comparator; /** * 具體的比較類(比較器),實現Comparator接口 * @author breeze * */ public class ComparatorConsunInfo implements Comparator<ConsumInfo> { /** * 順序(從小到大): * if(price < o.price){ return -1; } if(price > o.price){ return 1; } * 倒序(從大到小): * if(price < o.price){ return 1; } if(price > o.price){ return -1; } */ @Override public int compare(ConsumInfo o1, ConsumInfo o2) { //首先比較price,若是price相同,則比較uid if(o1.getPrice() > o2.getPrice()){ return 1; } if(o1.getPrice() < o2.getPrice()){ return -1; } if(o1.getPrice() == o2.getPrice()){ if(o1.getUid() > o2.getUid()){ return 1; } if(o1.getUid() < o2.getUid()){ return -1; } } return 0; } } /** * 須要進行比較的類 * @author breeze * */ public class ConsumInfo{ private int uid; private String name; private double price; private Date datetime; public ConsumInfo() { // TODO Auto-generated constructor stub } public ConsumInfo(int uid,String name,double price,Date datetime){ this.uid = uid; this.name = name; this.price = price; this.datetime = datetime; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getDatetime() { return datetime; } public void setDatetime(Date datetime) { this.datetime = datetime; } @Override public String toString() { return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price + ", datetime=" + datetime + "]"; } } //測試類 public class ConsumInfoTest { public static void main(String[] args) { ConsumInfo consumInfo1 = new ConsumInfo(100, "consumInfo1", 400.0,new Date()); ConsumInfo consumInfo2 = new ConsumInfo(200, "consumInfo1", 200.0,new Date()); ConsumInfo consumInfo3 = new ConsumInfo(300, "consumInfo1", 100.0,new Date()); ConsumInfo consumInfo4 = new ConsumInfo(400, "consumInfo1", 700.0,new Date()); ConsumInfo consumInfo5 = new ConsumInfo(500, "consumInfo1", 800.0,new Date()); ConsumInfo consumInfo6 = new ConsumInfo(600, "consumInfo1", 300.0,new Date()); ConsumInfo consumInfo7 = new ConsumInfo(700, "consumInfo1", 900.0,new Date()); ConsumInfo consumInfo8 = new ConsumInfo(800, "consumInfo1", 400.0,new Date()); List<ConsumInfo> list = new ArrayList<ConsumInfo>(); list.add(consumInfo1); list.add(consumInfo2); list.add(consumInfo3); list.add(consumInfo4); list.add(consumInfo5); list.add(consumInfo6); list.add(consumInfo7); list.add(consumInfo8); System.out.println("排序前:"); //排序前 for(ConsumInfo consumInfo : list ){ System.out.println(consumInfo); } ComparatorConsunInfo comparatorConsunInfo = new ComparatorConsunInfo();//比較器 Collections.sort(list,comparatorConsunInfo);//排序 System.out.println("排序後:"); //排序後 for(ConsumInfo consumInfo :list){ System.out.println(consumInfo); } } }