今天,简单讲讲android的如何使用



Comparator比较对象的大小。

记得之前也讲过比较对象的大小,也是使用Comparator,但是但是讲的比较浅,而且有些细节没有弄好。最近再次需要使用Comparator比较对象大小,所以自己在网上查找了资料,解决了问题。这里记录一下。

Java中实现对象的比较:Comparable接口和Comparator接口

在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系。

一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返回0。

一、Comparable接口

1.什么是Comparable接口

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。

2.实现什么方法

int compareTo(T o)

比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

参数: o - 要比较的对象。

返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。

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;}@Overridepublic 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;}* */@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);}}
}

这里,我说一下,其实就是让类实现Comparable接口,然后之前调用Collections.sort(list)进行排序。但是我使用这个Comparable接口是没有成功对对讲进行排序,不知道为什么,大家有兴趣可以试试。



二、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;}*/@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的情况,不能忽略对象相等的情况。


接下来再举一个例子:

假设现在有个如此的需求:需要对一个这样的雇员列表进行排序,排序规则如下:
    1、首先级别最高的排在前面,
    2、如果级别相等,那么按工资排序,工资高的排在前面,
    3、如果工资相当则按入职年数排序,入职时间最长的排在前面。

雇员对象包含级别、工资和入职年份,代码如下:

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;/*** 入职年数*/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;}
}

二、实现Comparator接口

这里我们实现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 {//按入职年数降序排列a = employee2.getYear() - employee1.getYear();if (a != 0) {cr = (a > 0) ? 1 : -3;}}}return cr;}}

三、验证排序结果

下面用一个单元测试,来验证排序结果是否正确

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("=============================");}
}

运行结果:

android Comparator的使用就讲完了。

就这么简单。

android Comparator的使用相关推荐

  1. android comparator,Comparator和Comparable实现排序的例子源码及其对比

    [Java] 纯文本查看 复制代码package object_sort; import java.text.ParseException; import java.text.SimpleDateFo ...

  2. android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题

    android  java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...

  3. android 视频的缩略图 缓存机制和 异步加载缩略图

    在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...

  4. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  5. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  6. Android API Demo程序框架

    前言 android API Demo程序主要演示了Android常见API的使用方法, 本文将该程序的框架提取出来, 以作为自己研究和学习Android编程的一个示例收集框架,即将所有自己研究过的例 ...

  7. Android实用代码(不定期更新)

    Android实用代码七段(一) 一抹火焰 整理(不定期更新) 前言 这里积累了一些不常见确又很实用的代码,每收集7条更新一次,希望能对大家有用. 声明: 欢迎转载,但请保留文章原始出处:)  博客园 ...

  8. android使用软引用构建缓存

    转自:http://www.devdiv.com/Android-%E4%BD%BF%E7%94%A8%E8%BD%AF%E5%BC%95%E7%94%A8%E6%9E%84%E5%BB%BA%E7% ...

  9. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

最新文章

  1. Mysql自带客户端与可视化客户端的乱码处理
  2. CentOS 8.0 今天已正式发布!一起看看有哪些新特性
  3. Jedis干什么用的
  4. 中英数字混合的字符串截取
  5. DE1-LINUX运行
  6. [推荐] 世界上最健康的作息时间表
  7. 极限学习机和支持向量机_极限学习机I
  8. [导入]数据库物理模型设计的其他模式之继承模式
  9. 95-32-010-ChannelPipeline-ChannelPipeline简介
  10. Linux_CentOS-服务器搭建 五 补充
  11. Jquery实现循环删除Reaper某一行
  12. matlab norm函数使用_matlab中norm函数的用法(图)
  13. 疯狂java讲义第七章课后习题答案
  14. vant ,vue 图片上传压缩
  15. 上网行为管理软件的功能
  16. java马里奥_java马里奥毕业设计
  17. 关于 TFT 、 TFD 、 UFB 、 STN 、 DSTN 和 OLED
  18. 使用nginx反向代理发起跨域请求
  19. 2022年4月23日美团笔试
  20. Golang线程池gpool

热门文章

  1. CSS样式和class应用
  2. Vagrant使用简介
  3. Hadoop 同步集群时间ntp
  4. 采用个hook技术对writefile函数进行拦截(2)
  5. unicode 编解码记录
  6. power(乘幂)函数剖析
  7. LeetCode 79 Word Search(单词查找)
  8. 幸福的2016-----年终总结
  9. 沉浸式模式与沉浸式状态栏
  10. 也记一次性能优化:LINQ to SQL中Contains方法的优化