日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android Comparator的使用

發(fā)布時間:2024/4/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android Comparator的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


今天,簡單講講android的如何使用 

Comparator比較對象的大小。


記得之前也講過比較對象的大小,也是使用Comparator,但是但是講的比較淺,而且有些細節(jié)沒有弄好。最近再次需要使用Comparator比較對象大小,所以自己在網(wǎng)上查找了資料,解決了問題。這里記錄一下。


Java中實現(xiàn)對象的比較:Comparable接口和Comparator接口

在實際應用中,我們往往有需要比較兩個自定義對象大小的地方。而這些自定義對象的比較,就不像簡單的整型數(shù)據(jù)那么簡單,它們往往包含有許多的屬性,我們一般都是根據(jù)這些屬性對自定義對象進行比較的。所以Java中要比較對象的大小或者要對對象的集合進行排序,需要通過比較這些對象的某些屬性的大小來確定它們之間的大小關(guān)系。

一般,Java中通過接口實現(xiàn)兩個對象的比較,比較常用就是Comparable接口和Comparator接口。首先類要實現(xiàn)接口,并且使用泛型規(guī)定要進行比較的對象所屬的類,然后類實現(xiàn)了接口后,還需要實現(xiàn)接口定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入需要比較大小的另一個對象,通過選定的成員變量與之比較,如果大于則返回1,小于返回-1,相等返回0。


一、Comparable接口

1.什么是Comparable接口

此接口強行對實現(xiàn)它的每個類的對象進行整體排序。此排序被稱為該類的自然排序?,類的?compareTo方法被稱為它的自然比較方法?。實現(xiàn)此接口的對象列表(和數(shù)組)可以通過?Collections.sort(和?Arrays.sort?)進行自動排序。實現(xiàn)此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。?

2.實現(xiàn)什么方法

int compareTo(T o)

比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數(shù)、零或正整數(shù)。

參數(shù): o - 要比較的對象。

返回:負整數(shù)、零或正整數(shù),根據(jù)此對象是小于、等于還是大于指定對象。

拋出:ClassCastException - 如果指定對象的類型不允許它與此對象進行比較。


3.實例

package com.mxl.algorithlm;import java.util.Date; /*** 因為要實現(xiàn)對ConsumInfo對象的排序,所以在ConsunInfo類中要實現(xiàn)Comparable接口,也就是要實現(xiàn)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;}@Overridepublic String toString() {return "ConsumInfo [uid=" + uid + ", name=" + name + ", price=" + price+ ", datetime=" + datetime + "]";}/*** 這里比較的是什么, Collections.sort方法實現(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;}}//測試類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);}} }


這里,我說一下,其實就是讓類實現(xiàn)Comparable接口,然后之前調(diào)用Collections.sort(list)進行排序。但是我使用這個Comparable接口是沒有成功對對講進行排序,不知道為什么,大家有興趣可以試試。



二、Comparator接口

與上面的Comparable接口不同的是:

①、Comparator位于包java.util下,而Comparable位于包java.lang下。

②、Comparable接口將比較代碼嵌入需要進行比較的類的自身代碼中,而Comparator接口在一個獨立的類中實現(xiàn)比較。

③、如果前期類的設計沒有考慮到類的Compare問題而沒有實現(xiàn)Comparable接口,后期可以通過Comparator接口來實現(xiàn)比較算法進行排序,并且為了使用不同的排序標準做準備,比如:升序、降序。

④、Comparable接口強制進行自然排序,而Comparator接口不強制進行自然排序,可以指定排序順序。

使用實例:

package test;import java.util.Comparator; /*** 具體的比較類(比較器),實現(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;}}/*** 需要進行比較的類* @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 + "]";}}//測試類 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接口,一定需要處理對象>0,=0,和<0的情況,不能忽略對象相等的情況。


接下來再舉一個例子:

假設現(xiàn)在有個如此的需求:需要對一個這樣的雇員列表進行排序,排序規(guī)則如下:
??? 1、首先級別最高的排在前面,
??? 2、如果級別相等,那么按工資排序,工資高的排在前面,
??? 3、如果工資相當則按入職年數(shù)排序,入職時間最長的排在前面。

雇員對象包含級別、工資和入職年份,代碼如下:

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;/*** 級別*/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;} }

二、實現(xiàn)Comparator接口

這里我們實現(xiàn)Java.util.Comparator接口,用于對雇員列表進行排序,代碼如下:

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;//按級別降序排列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;}}

三、驗證排序結(jié)果

下面用一個單元測試,來驗證排序結(jié)果是否正確

package com.lyz.sort.test;import java.util.ArrayList; import java.util.Collections; import java.util.List;import org.junit.Test;import com.lyz.sort.EmpComparator; import com.lyz.sort.bean.Employee;/*** 測試排序類* * @author liuyazhuang**/ public class SortTest {@Testpublic void sortTest() throws Exception {List<Employee> employeeList = new ArrayList<Employee>() {{add(new Employee(1, 9, 10000, 10));add(new Employee(2, 9, 12000, 7));add(new Employee(3, 5, 10000, 12));add(new Employee(4, 5, 10000, 6));add(new Employee(5, 3, 5000, 3));add(new Employee(6, 1, 2500, 1));add(new Employee(7, 5, 8000, 10));add(new Employee(8, 3, 8000, 2));add(new Employee(9, 1, 3000, 5));add(new Employee(10, 1, 2500, 4));add(new Employee(11, 2, 2000, 4));}};Collections.sort(employeeList, new EmpComparator());System.out.println("ID\tLevel\tSalary\tYears");System.out.println("=============================");for (Employee employee : employeeList) {System.out.printf("%d\t%d\t%d\t%d\n", employee.getId(), employee.getLevel(), employee.getSalary(),employee.getYear());}System.out.println("=============================");} }


運行結(jié)果:



android Comparator的使用就講完了。


就這么簡單。

總結(jié)

以上是生活随笔為你收集整理的android Comparator的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。