首页 > 其他分享 >八(三)、常用类之比较器Comparable Comparator

八(三)、常用类之比较器Comparable Comparator

时间:2022-09-29 15:07:29浏览次数:42  
标签:Comparable Goods return Comparator 常用 接口 new goodsArr public

一、说明:

  java 中的对象,正常情况下,只能进行:== or !=,不能使用> 或<的,(基本数据类型是都可以比较的)
  但是实际开发场景中我们需要对多个对象进行排序,就需要比较对象的大小需要使用两个接口中的任何一个:
  comparable 或者 comparator   

二、comparable的使用

 1.compare接口使用说明

    1.1.像String、包装类实现了Comparable接口,重写了ComparableTo(obj)方法,给出了比较两个对象大小的方式

    1.2..像String、包装类重写compareto() 方法以后,进行了从小到大的排列;

    1.3.对于自定义类来说,如果需要排序,我们可以让自定义类实现compare接口,重写CompareTo()方法,在compareto()中指明如何排序;
    1.4.重写compareto()的规则:
         如果当前对象this 大于形参对象obj,则返回正整数,
         如果当前对象this小于形参对象obj,则返回负数;
         如果当前对象this小于形参对象obj,则返回0;

2.String 的排序举例:

1 @Test
2 public void test() {
3 String[] arr = new String[]{"AA","DD","BB","KK","JJ"};
4 Arrays.sort(arr);
5 System.out.println(Arrays.toString(arr));
6

这里Arrays.sort(arr)之后,自动从小到大排序;原因就是 String重写了ComparableTo(obj)方法,指定了排序规则,即从小到大排序;

3.自定义排序举例:

排序类:

 

1 package commonmethod.testClass;
2
3 //商品类
4 public class Goods implements Comparable<Goods>{
5 private Double price;
6 private String name;
7 public Double getPrice() {
8 return price;
9 }
10 public void setPrice(Double price) {
11 this.price = price;
12 }
13 public String getName() {
14 return name;
15 }
16 public void setName(String name) {
17 this.name = name;
18 }
19 public Goods(Double price, String name) {
20 super();
21 this.price = price;
22 this.name = name;
23 }
24 //指明 商品比较大小的方式,价格从低到高进行排序;
25 @Override
26 public int compareTo(Goods o) {
27 if(this.price>o.price) {
28 return 1;
29 }else if(this.price<o.price) {
30 return -1;
31 }
32 // TODO Auto-generated method stub
33 return 0;
34 }
35 @Override
36 public String toString() {
37 return "Goods [price=" + price + ", name=" + name + "]";
38 }
39
40
41

View Code

排序方法体:

 

1     @Test
2 public void test1() {
3 Goods[] arr = new Goods[4];
4 arr[0] = new Goods(34.0,"lenovoMouse");
5 arr[1] = new Goods(43.0,"dellMouse");
6 arr[2] = new Goods(12.0,"xiaomiMouse");
7 arr[3] = new Goods(65.0,"huaweiMouse");
8 Arrays.sort(arr);//Goods实现了Comparale接口,重写了comparable接口,否则报错;
9 System.out.println(Arrays.toString(arr));
10
11
12

 

以下重写了Comparable接口的compareTo方法;可以自定义排序规则;
    @Override
    public int compareTo(Goods o) {
        if(this.price>o.price) {
            return 1;
        }else if(this.price<o.price) {
            return -1;
        }
        // TODO Auto-generated method stub
        return 0;
    }

 

 

 

三、comparator的使用

1.comparator 接口的使用:定制排序  

  1.1.背景:
     当元素的类型没有实现comparable接口,而且又不方便修改代码
     或者实现了commpare接口的排序规则不适合当前操作,那么就需要使用comparator
     1.2.重写compare(object o1,object2 o2)方法,比o1,o2的大小;
     如果方法返回正数,则o1>o2,
     如果方法返回负数,则o1<o2,
     如果方法返回0,则o1=o2,

public voidnew Goods[4];
new Goods(34.0,"lenovoMouse");
new Goods(43.0,"dellMouse");
new Goods(12.0,"xiaomiMouse");
new Goods(65.0,"huaweiMouse");
//Goods实现了Comparale接口,重写了comparable接口,否则报错;
10
11
12 }

这个例子使用comparator 实现:
1 @Test
2 public void test2() {
3 String[] arr = new String[]{"AA","DD","BB","KK","JJ"};
4 Comparator c = new Comparator() {//匿名子类的非匿名对象;
5
6 @Override
7 public int compare(Object o1, Object o2) {
8
9 return -1;
10 }};
11 Arrays.sort(arr, c);
12
13 System.out.println(Arrays.toString(arr));
14 Goods[] goodsArr = new Goods[5];
15 goodsArr[0] = new Goods(34.0,"lenovoMouse");
16 goodsArr[1] = new Goods(43.0,"dellMouse");
17 goodsArr[2] = new Goods(12.0,"xiaomiMouse");
18 goodsArr[3] = new Goods(65.0,"huaweiMouse");
19 goodsArr[4] = new Goods(66.0,"huaweiMouse");
20 //按价格排序
21 Arrays.sort(goodsArr,new Comparator<Goods>() {//匿名对象的匿名子类
22
23 @Override
24 public int compare(Goods o1, Goods o2) {
25 // TODO Auto-generated method stub
26 if(o1.getPrice()>o2.getPrice()) {
27 return -1;
28 }else if(o1.getPrice()<o2.getPrice()) {
29 return 1;
30 }else {
31 return 0;
32 }
33
34 }
35 });//Goods实现了Comparale接口,重写了comparable接口,否则报错;
36 System.out.println(Arrays.toString(goodsArr));
37
38

扩展:按名称排序,如果名称相同,按价格排序 都是倒叙

1 @Test
2 public void test2() {
3 Goods[] goodsArr = new Goods[5];
4 goodsArr[0] = new Goods(34.0,"lenovoMouse");
5 goodsArr[1] = new Goods(43.0,"dellMouse");
6 goodsArr[2] = new Goods(12.0,"xiaomiMouse");
7 goodsArr[3] = new Goods(65.0,"huaweiMouse");
8 goodsArr[4] = new Goods(66.0,"huaweiMouse");
9
10 Arrays.sort(goodsArr,new Comparator<Goods>() {//抽象类中的 匿名对象的匿名子类
11
12 @Override
13 public int compare(Goods o1, Goods o2) {
14 // TODO Auto-generated method stub
15 if(o1.equals(o2.getName())) {
16 if(o1.getPrice()>o2.getPrice()) {
17 return -1;
18 }else if(o1.getPrice()<o2.getPrice()) {
19 return 1;
20 }else {
21 return 0;
22 }
23 }else {
24 return -o1.getName().compareTo(o2.getName());
25 }
26
27 }
28 });//Goods实现了Comparale接口,重写了comparable接口,否则报错;
29 System.out.println(Arrays.toString(goodsArr));
30
31

 2.Comparator 1.8 新特性:

1.8新特性--Comparator

四、comparable接口与Comparator接口比较 

  • comparable接口一旦指定,保证Comparable接口实现类在任何位置都能使用;
  • Comparator接口属于临时性的比较

 

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。



标签:Comparable,Goods,return,Comparator,常用,接口,new,goodsArr,public
From: https://blog.51cto.com/u_10632206/5722940

相关文章

  • linux尝试wine以及国产常用软件总结
    建议不要折腾,可以尝试https://www.spark-app.store/或者deepin。有专业的人做,还是交给专业的人,自己就不要浪费时间了。实际上这并不是linux的错,也不是linux不好用,而是国产......
  • nginx常用命令
    验证配置是否正确:nginx-t查看Nginx的版本号:nginx-V启动Nginx:startnginx快速停止或关闭Nginx:nginx-sstop正常停止或关闭Nginx:nginx-squit配置文件修改重装载......
  • 常用网络诊断的命令收集
    常用网络诊断的命令收集>ipconfig 用于查看本机的ip,网关等信息IPConfig实用程序和它的等价图形用户界面——Windows95/98中的WinIPCfg可用于显示当前的TCP/IP配......
  • Kafka常用命令
    启动Kafka后台常驻方式,带上参数 -daemon,如:/usr/local/kafka/bin/kafka-server-start.sh-daemon/usr/local/kafka/config/server.properties指定JMXport端口启......
  • nginx 常用全局变量
    变量说明$args请求中的参数,如​​www.123.com/1.php?a=1&b=2的$args就是a=1&b=2​​$content_lengthHTTP请求信息里的"Content-Length"$conten_typeHTTP请求信息里的"Conten......
  • 常用mysql注入语句
    1、利用orderby判断字段数。2、利用unionselect联合查询,获取表名。0'unionselect1,group_concat(table_name),3frominformation_schema.tableswheretable_schema......
  • 键盘常用快捷键学习
    键盘基础常用快捷键选择键作用ctrl+c复制ctrl+v粘贴ctrl+z撤销ctrl+x剪切Windows+R运行程序Windows+E打开本电脑ctrl+shift+Esc打开任......
  • cmd打开方式及常用的DOS命令
    打开CMD方式1开始+系统+命令提示符(以管理员身份运行)2win+r输入CMD打开控制台3文件夹下按住SHIFT右键在此处打开power常用的DOS命令#盘符切换#查看当前目录下的所有文......
  • iptables 常用命令解析
    查看当前iptables规则:iptables-n-L--line-numbers该命令会以列表的形式显示出当前使用的iptables规则,并不做解析,每一条规则前面的编号可以用来做为其它操作,例如后面的......
  • Metasploit 常用命令手册
    Installationcurlhttps://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb>msfinstall&&......