Java比较器

前言

本篇文章主要介绍的是Java比较器的实现与测试。

1.java.lang.Comparable排序接口

定义:

Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

Comparable接口中的方法:

接口中的方法

说明

int compareTo(T t)

比较当前对象与传入进来对象的大小

参数:t 表示要比较的对象,返回值:如果当前的对象大于t,返回正整数。如果当前的对象等于t,返回0。如果当前对象小于t,返回负整数

这是Java的一种约定,当排序的sort()方法在对集合中的元素两两进行比较的时候会调用我们实现的compareTo(T t)方法。如果compareTo()返回正整数,则表示当前元素大于和它比较的元素;如果返回负整数则表示当前元素小于和它比较的元素;如果返回0,则表示两者相等。

案例
1//实体类实现Comparable接口 2@Data 3public class Record implements Comparable<Record> { 4 private String name; 5 private int num; 6 7 public Record(String name,int num) { 8 this.name = name; 9 this.num = num; 10 } 11 @Override 12 public String toString() { 13 return "("+name+","+num+")"; 14 } 15 16 //重写compareTo方法,方法内定义排序规则 17 @Override 18 public int compareTo(Record r) { 19 //1.name属性字符串类型比较unicode值 20 return this.name.compareTo(r.name)21------------ 22 //2.price属性数值类型比较大小 23 if(this.num > r.num){ 24 return 1; 25 }else if(this.num < r.num){ 26 return -1; 27 }else{ 28 return 0; 29 } 30------------ 31 //3.price属性数值类型比较大小 32 return this.num - r.num; 33------------ 34 //4.price属性包装类比较大小 35 return Integer.compare(this.num, r.getNum()); 36------------ 37 //5.name属性字符串类型按照拼音字母进行排序 38 return Collator.getInstance(Locale.CHINA).compare(this.name,r.name); 39 } 40}

针对最后一种排序规则,jdk自带的Collator包涵的汉字太少了,对一些生僻的姓氏不能进行排序。Collator推荐使用:import com.ibm.icu.text.Collator; pom依赖:

1<dependency> 2 <groupId>com.ibm.icu</groupId> 3 <artifactId>icu4j</artifactId> 4 <version>57.1</version> 5</dependency>
测试:
1 @Test 2 public void test2() { 3 ArrayList<Record> list = new ArrayList<>(); 4 //添加元素到list 5 Collections.addAll(list, 6 new Record("日本",1), 7 new Record("印尼",4), 8 new Record("菲律宾",2), 9 new Record("中国",5), 10 new Record("中国香港",3), 11 new Record("斐济",6)); 12 //排序前输出 13 System.out.println(list); 14 //[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)] 15 //排序 16 Collections.sort(list); 17 //排序后输出 18 System.out.println(list); 19 //1.[(中国,5), (中国香港,3), (印尼,4), (斐济,6), (日本,1), (菲律宾,2)] 20 //2、3、4.[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)] 21 //5.[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)] 22 }

2.java.util.Comparator比较器接口

定义:

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

Comparable接口中的方法:

接口中的方法

说明

int compare(T t1, T t2)

比较t1和t2这两个对象,如果:t1 > t2,这个方法返回正整数;t2 == t1,返回0;t1 < t2,这个方法返回负整数

案例
1//创建实体类 2@Data 3public class Record{ 4 private String name; 5 private int num; 6 7 public Record(String name,int num) { 8 this.name = name; 9 this.num = num; 10 } 11 12 @Override 13 public String toString() { 14 return "("+name+","+num+")"; 15 } 16} 17 18 19//测试 20public class Demo { 21 @Test 22 public void test() { 23 List<Record> list = new ArrayList<>(); 24 Collections.addAll(list, 25 new Record("日本",1), 26 new Record("印尼",4), 27 new Record("菲律宾",2), 28 new Record("中国",5), 29 new Record("中国香港",3), 30 new Record("斐济",6)); 31 System.out.println(list); 32 //使用比较器中的排序规则进行排序 33 Collections.sort(list,new NameComparator()); 34 System.out.println(list); 35 Collections.sort(list,new NumComparator()); 36 System.out.println(list); 37 //以上输出 38 //[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)] 39 //[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)] 40 //[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)] 41 } 42} 43 44//名称比较器,按汉字拼音顺序 45class NameComparator implements Comparator<Record> { 46 @Override 47 public int compare(Record r1, Record r2) { 48 return Collator.getInstance(Locale.CHINA).compare(r1.getName(),r2.getName()); 49 } 50} 51//数字比较器,按大小 52class NumComparator implements Comparator<Record> { 53 @Override 54 public int compare(Record r1, Record r2) { 55 return r1.getNum() - r2.getNum(); 56 } 57}

使用匿名内部类形式实现Comparator接口

1public class Demo { 2 @Test 3 public void test() { 4 List<Record> list = new ArrayList<>(); 5 Collections.addAll(list, 6 new Record("日本",1), 7 new Record("印尼",4), 8 new Record("菲律宾",2), 9 new Record("中国",5), 10 new Record("中国香港",3), 11 new Record("斐济",6)); 12 System.out.println(list); 13 Collections.sort(list, new Comparator<Record>() { 14 @Override 15 public int compare(Record r1, Record r2) { 16 return Collator.getInstance(Locale.CHINA).compare(r1.getName(),r2.getName()); 17 } 18 }); 19 System.out.println(list); 20 //使用比较器中的排序规则进行排序 21 Collections.sort(list, new Comparator<Record>() { 22 @Override 23 public int compare(Record r1, Record r2) { 24 return r1.getNum()-r2.getNum(); 25 } 26 }); 27 System.out.println(list); 28 //以上输出 29 //[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)] 30 //[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)] 31 //[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)] 32 } 33}

3.Comparable和Comparator区别比较

Comparable 和 Comparator 都是用来实现集合中的排序的,只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。

1.Comparable位于包java.lang下,Comparator位于包java.util下。Comparable接口将比较代码嵌入自身类中,而Comparable在一个独立的类中实现比较。

2.如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator 来实现比较算法进行排序。

3.Comparator为了使用不同的排序规则做准备。比如:升序、降序或按不同的属性进行排序。

4.注

字符串比较的规则: 从字符串的第1个字符开始比较大小,比较它们的ASCII码值。如果第1个字符相等,则比较第2个字符。依次类推,直到比较出大小为止。 如果是汉字,则比较Unicode值。

CSDN:https://blog.csdn.net/qq_27682773 简书:https://www.jianshu.com/u/e99381e6886e 博客园:https://www.cnblogs.com/lixianguo 个人博客:https://www.lxgblog.com

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java中集合排序常用的方式

1.集合排序概述1.1集合排序的主要内容:集合中的级别数据类型排序集合中的字符串排序Comparator接口Comparable接口1.2数组排序回顾intarr12,25,22,17,89,22;Arrays.sort(arr);输出:12,17,22,22,25,89Java的Arrays类中有一个sort()方法,该方法是Ar

java.lang.Comparable

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