Comparable(比较器的使用)

Comparable(比较器的使用)


对比较器的理解 ---> 建议先看理解

对Collection的理解
两种比较器 :1- compareTo   2- new Comparator()

一、
   当我们把类 --> 实现了implements Comparable  -->会重写compareTo方法
                                       (这个是通用方法,这个规定用什么来比较,就用什么来比较)

     
     对实现了Comparable -- >方法的代码演示:
       1-让类实现implements Comparable
       2-会重写compareTo方法

        下面为正文:
       ----------------->
   /*
      1-  public class Person implements Comparable (1- 实现){
           private String name;
           private int age;
           private MyDate birthday;
           
       2-    @Override ( 2- 重写)
               public int compareTo(Object o) {
                   if (o instanceof Person) {
                       Person p = (Person) o;
                       return this.name.compareTo(p.name);
                   }
                   throw new RuntimeException("输入错误");
               }

     */


二、
   1-当然,我们不能被困死,所以有了new Comparator();方法

   2- 用Comparator()方法的场景
       场景: 上面的compareTo规定的按名字来比较大小,这个时候,你要以年龄来比较大小 -->  需求不就来了

   3- 我们只要在  集合/数组  里面new Comparator();   重写方法即可
        
        下面是正文:
   ------------->
   /*
    //对new Comparator();方法的代码解析:
    
    1- TreeSet treeSet = new TreeSet(new Comparator() {   //(1- new Comparator();)
               @Override
               public int compare(Object o1, Object o2) {  //2- 重写
                   if (o1 instanceof Person && o2 instanceof Person) {
                       Person person1 = (Person) o1;  //记得大写
                       Person person2 = (Person) o2;
   
                       MyDate birthday1 = person1.getBirthday();
                       MyDate birthday2 = person2.getBirthday();
   
                       //比较年
                       int year = birthday1.getYear() - birthday2.getYear();
                       if (year != 0) {
                           return year;
                       }
   
                       //比较月
                       int month = birthday1.getMonth() - birthday2.getMonth();
                       if (month != 0) {
                           return month;
                       }
   
                       //比较日
                       return birthday1.getDay() - birthday2.getDay();
   
                   }
                   throw new RuntimeException("输入错误");
               }
           });
   
   */

1 --->先定义 CompareTo方法

package _366After.src.javeTeacher.compare.learn_compare;

/*
解释:--comparable对(自定义类)的比较
1- 让对比的(自定义类)implements Comparable
2- 重写compareTo
 */
public class Goods implements Comparable {
    private String name;
    private double price;

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    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;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    //值明-商品大小来排序
    public int compareTo(Object o) {

        if (o instanceof Goods) {
            Goods goods = (Goods) o;
            //方式一、
            if (this.price > goods.price) {
                return 1;
            } else if (this.price < goods.price) {
                //return 0;
                return -this.name.compareTo(goods.name);
            }
            //方式二、  return Double.compare(this.price, goods.price);
            return this.name.compareTo(goods.name);
        }
        throw new RuntimeException("你输入的类型有误");
    }
}

2-比较器的使用  ---> 使用CompareTo方法  and  Comparator方法

package _366After.src.javeTeacher.compare.learn_compare;

import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.Comparator;

/*
一、正常的java只能用 == 或者 !=  来比较大小
    不能用<  或者  >
    当我们需要对"对象"进行比较大小的时候--可以使用comparable 、comparator

二、comparable接口使用 -->自然排序(从小到大)

***三、1-对于String、包装类  ---直接使用Arrays.sort(XX数组);  来比较大小
       2-如果是(自定义类)--需要 : 1-让对比的(自定义类中)implements Comparable 、 2- (在自定义类中)重写compareTo  3、再使用Arrays.sort(XX数组);  来比较大小
 */
public class learn_Compare {
    //comparable的使用
    @Test
    public void TestComparable1() {
        String[] str = new String[]{"ww", "aa", "cc", "rr", "tt"};
        Arrays.sort(str);//从小到大
        System.out.println(Arrays.toString(str));
    }

    @Test
    public void TestComparable2() {//比较(自定义)的类

        Goods[] goods = new Goods[5];
        //调用构造器用new Goods();
        goods[0] = new Goods("xiaomi", 23);//这里因为我的Goods什么方法都没写,为了可以赋值,就new Goods()调用的是有参构造器
        goods[1] = new Goods("dell", 153);
        goods[2] = new Goods("sanxin", 98);
        goods[3] = new Goods("huawei", 103);
        goods[4] = new Goods("huasuo", 103);

        Arrays.sort(goods);//从小到大
        System.out.println(Arrays.toString(goods));


    }
    
    
    -- > 这上面还是使用CompareTo -类中的比较器(来实现)

//————————————————————————————————————————————————————————————————————————————————————————
//————————————————————————————————————————————————————————————————————————————————————————
        
     -- > 下面是脱离CompareTo的束缚 ,使用comparator方法(再次自定义)   

    /*
    Comparator比较器(定制排序)
背景:1- 元素类没有实现Java.lang.Comparable接口而又不方便修改代码,
        或者实现java.lang.Comparable接口的排序规则不适合当前的操作,
        那么可以考虑使用Comparable的对象来排序
     */
    @Test
    //自定义类:从大到小排列
    public void customComparable1() {
        String[] str = new String[]{"ww", "aa", "cc", "rr", "tt"};
        Arrays.sort(str, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1 instanceof String && o2 instanceof String) {
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
                //return 0;
                throw new RuntimeException("输入的类型不一样");
            }
        });
        System.out.println(Arrays.toString(str));
    }

    @Test
    public void customComparable2() {
        Goods[] goods = new Goods[6];
        //调用构造器用new Goods();
        goods[0] = new Goods("xiaomi", 23);//这里因为我的Goods什么方法都没写,为了可以赋值,就new Goods()调用的是有参构造器
        goods[1] = new Goods("dell", 153);
        goods[2] = new Goods("dell", 267);
        goods[3] = new Goods("sanxin", 98);
        goods[4] = new Goods("huawei", 103);
        goods[5] = new Goods("huasuo", 103);

        //用自然类 -->  Arrays.sort(goods);//从小到大
        Arrays.sort(goods, new Comparator() {
            //重写了Comparable
            //指定商品比较大小的方式:按照产品的名称从低到高,再按照价格从高到低
            @Override
            public int compare(Object o1, Object o2) {

                if (o1 instanceof Goods && o2 instanceof Goods) {
                    Goods goods1 = (Goods) o1;
                    Goods goods2 = (Goods) o2;
                    if (goods1.getName().equals(goods2.getName())) {
                        return -Double.compare(goods1.getPrice(), goods2.getPrice());
                    } else {
                        return goods1.getName().compareTo(goods2.getName());
                    }
                }
                throw new RuntimeException("输入的类型不对");
            }
        });
        System.out.println(Arrays.toString(goods));
    }
}

 

分析:就是

1- 让对比的(自定义类)implements Comparable
2- 重写compareTo

     对2-的理解:重点就是在重写的时候:可以直接在(自定义类中重写--自然类),但是要多样性,可以在接收页面重写。

posted on 2022-06-07 11:01  陈嘻嘻-  阅读(485)  评论(0编辑  收藏  举报

导航