android Comparator的使用
今天,簡(jiǎn)單講講android的如何使用
Comparator比較對(duì)象的大小。
記得之前也講過(guò)比較對(duì)象的大小,也是使用Comparator,但是但是講的比較淺,而且有些細(xì)節(jié)沒(méi)有弄好。最近再次需要使用Comparator比較對(duì)象大小,所以自己在網(wǎng)上查找了資料,解決了問(wèn)題。這里記錄一下。
Java中實(shí)現(xiàn)對(duì)象的比較:Comparable接口和Comparator接口
在實(shí)際應(yīng)用中,我們往往有需要比較兩個(gè)自定義對(duì)象大小的地方。而這些自定義對(duì)象的比較,就不像簡(jiǎn)單的整型數(shù)據(jù)那么簡(jiǎn)單,它們往往包含有許多的屬性,我們一般都是根據(jù)這些屬性對(duì)自定義對(duì)象進(jìn)行比較的。所以Java中要比較對(duì)象的大小或者要對(duì)對(duì)象的集合進(jìn)行排序,需要通過(guò)比較這些對(duì)象的某些屬性的大小來(lái)確定它們之間的大小關(guān)系。
一般,Java中通過(guò)接口實(shí)現(xiàn)兩個(gè)對(duì)象的比較,比較常用就是Comparable接口和Comparator接口。首先類要實(shí)現(xiàn)接口,并且使用泛型規(guī)定要進(jìn)行比較的對(duì)象所屬的類,然后類實(shí)現(xiàn)了接口后,還需要實(shí)現(xiàn)接口定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入需要比較大小的另一個(gè)對(duì)象,通過(guò)選定的成員變量與之比較,如果大于則返回1,小于返回-1,相等返回0。
一、Comparable接口
1.什么是Comparable接口
此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序。此排序被稱為該類的自然排序?,類的?compareTo方法被稱為它的自然比較方法?。實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過(guò)?Collections.sort(和?Arrays.sort?)進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對(duì)象可以用作有序映射表中的鍵或有序集合中的元素,無(wú)需指定比較器。?
2.實(shí)現(xiàn)什么方法
int compareTo(T o)
比較此對(duì)象與指定對(duì)象的順序。如果該對(duì)象小于、等于或大于指定對(duì)象,則分別返回負(fù)整數(shù)、零或正整數(shù)。
參數(shù): o - 要比較的對(duì)象。
返回:負(fù)整數(shù)、零或正整數(shù),根據(jù)此對(duì)象是小于、等于還是大于指定對(duì)象。
拋出:ClassCastException - 如果指定對(duì)象的類型不允許它與此對(duì)象進(jìn)行比較。
3.實(shí)例
package com.mxl.algorithlm;import java.util.Date; /*** 因?yàn)橐獙?shí)現(xiàn)對(duì)ConsumInfo對(duì)象的排序,所以在ConsunInfo類中要實(shí)現(xiàn)Comparable接口,也就是要實(shí)現(xiàn)compareTo()方法* 具體的比較參照:依次按照price、uid進(jìn)行倒序排序* @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;}@Overridepublic String toString() {return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price+ ", datetime=" + datetime + "]";}/*** 這里比較的是什么, Collections.sort方法實(shí)現(xiàn)的就是按照此比較的東西排列* 順序(從小到大):* if(price < o.price){return -1;}if(price > o.price){return 1;}* 倒序(從大到小):* if(price < o.price){return 1;}if(price > o.price){return -1;}* */@Overridepublic int compareTo(ConsumInfo o) {//首先比較price,如果price相同,則比較uidif(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;}}//測(cè)試類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);}} }
這里,我說(shuō)一下,其實(shí)就是讓類實(shí)現(xiàn)Comparable接口,然后之前調(diào)用Collections.sort(list)進(jìn)行排序。但是我使用這個(gè)Comparable接口是沒(méi)有成功對(duì)對(duì)講進(jìn)行排序,不知道為什么,大家有興趣可以試試。
二、Comparator接口
與上面的Comparable接口不同的是:
①、Comparator位于包java.util下,而Comparable位于包java.lang下。
②、Comparable接口將比較代碼嵌入需要進(jìn)行比較的類的自身代碼中,而Comparator接口在一個(gè)獨(dú)立的類中實(shí)現(xiàn)比較。
③、如果前期類的設(shè)計(jì)沒(méi)有考慮到類的Compare問(wèn)題而沒(méi)有實(shí)現(xiàn)Comparable接口,后期可以通過(guò)Comparator接口來(lái)實(shí)現(xiàn)比較算法進(jìn)行排序,并且為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序。
④、Comparable接口強(qiáng)制進(jìn)行自然排序,而Comparator接口不強(qiáng)制進(jìn)行自然排序,可以指定排序順序。
使用實(shí)例:
package test;import java.util.Comparator; /*** 具體的比較類(比較器),實(shí)現(xiàn)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;}*/@Overridepublic int compare(ConsumInfo o1, ConsumInfo o2) {//首先比較price,如果price相同,則比較uidif(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;}}/*** 需要進(jìn)行比較的類* @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;}@Overridepublic String toString() {return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price+ ", datetime=" + datetime + "]";}}//測(cè)試類 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);}} }
這里需要知道使用Comparator接口,一定需要處理對(duì)象>0,=0,和<0的情況,不能忽略對(duì)象相等的情況。
接下來(lái)再舉一個(gè)例子:
假設(shè)現(xiàn)在有個(gè)如此的需求:需要對(duì)一個(gè)這樣的雇員列表進(jìn)行排序,排序規(guī)則如下:
??? 1、首先級(jí)別最高的排在前面,
??? 2、如果級(jí)別相等,那么按工資排序,工資高的排在前面,
??? 3、如果工資相當(dāng)則按入職年數(shù)排序,入職時(shí)間最長(zhǎng)的排在前面。
雇員對(duì)象包含級(jí)別、工資和入職年份,代碼如下:
package com.lyz.sort.bean;import java.io.Serializable;/*** 雇員信息* @author liuyazhuang**/ public class Employee implements Serializable {private static final long serialVersionUID = 4775629632953317597L;/*** ID*/public int id;/*** 級(jí)別*/public int level;/*** 工資*/public int salary;/*** 入職年數(shù)*/public int year;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public Employee(int id, int level, int salary, int year) {this.id = id;this.level = level;this.salary = salary;this.year = year;} }二、實(shí)現(xiàn)Comparator接口
這里我們實(shí)現(xiàn)Java.util.Comparator接口,用于對(duì)雇員列表進(jìn)行排序,代碼如下:
package com.lyz.sort;import java.util.Comparator;import com.lyz.sort.bean.Employee;/*** 核心排序類* @author liuyazhuang**/ public class EmpComparator implements Comparator<Employee> {@Overridepublic int compare(Employee employee1, Employee employee2) {int cr = 0;//按級(jí)別降序排列int a = employee2.getLevel() - employee1.getLevel();if (a != 0) {cr = (a > 0) ? 3 : -1;} else {//按薪水降序排列a = employee2.getSalary() - employee1.getSalary();if (a != 0) {cr = (a > 0) ? 2 : -2;} else {//按入職年數(shù)降序排列a = employee2.getYear() - employee1.getYear();if (a != 0) {cr = (a > 0) ? 1 : -3;}}}return cr;}}三、驗(yàn)證排序結(jié)果
下面用一個(gè)單元測(cè)試,來(lái)驗(yàn)證排序結(jié)果是否正確
運(yùn)行結(jié)果:
android Comparator的使用就講完了。
就這么簡(jiǎn)單。
總結(jié)
以上是生活随笔為你收集整理的android Comparator的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 代码设置EditText
- 下一篇: Android RelativeLayo