Compareable和Comparator

引言-为什么用Compareable和Comparator

  • 对象是什么?

对象是现实世界中事务的抽象或者建模
现实事务可能被抽象为多个对象,多个对象可以代表同一个现实事务,但是一个对象不能代表多个现实事务

在这里插入图片描述

这里说对象和事务就是站在不同世界的角度去说,把对象迁移到现实世界就用事务来表示,

  • 了解更多查看类和对象:

https://blog.csdn.net/qq_45630711/article/details/112067483

  • equals()
public class TestEquals {
    public static void main(String[] args) {
        Teacher t1=new Teacher("张三");
        Teacher t2=new Teacher("李四");
        System.out.println(t1.equals(t2));
        System.out.println(t1 == t2);
    }
}
class Teacher{
    String name;
    public Teacher(String name){
        this.name=name;
    }
}

在这里插入图片描述

  • 为什么结果都是false?

因为java语言本身无法得知,两个对象是够代表同一个现实的事务,它只知道按照是否是同一个对象处理,无法和我们现实世界联系,所以这个工作需要我们开发者来引导,那就是重写equals方法,通过设计的类目的根据某些属性作为依据来判断是否相等来决定是否代表同一个现实事务,是否同一个对象

  • 解决方法
  1. 重写equals方法,通过设计的类目的根据某些属性来判断是否相等来决定是否代表同一个现实事务,是否同一个对象
public class TestEquals {
    public static void main(String[] args) {
        Teacher t1=new Teacher("张三");
        Teacher t2=new Teacher("李四");
        Teacher t3=new Teacher("王五");
        Teacher t4=new Teacher("王五");
        System.out.println(t1.equals(t2));
        System.out.println(t1 == t2);
        System.out.println(t3.equals(t4));
    }

}
class Teacher{
    String name;
    public Teacher(String name){
        this.name=name;
    }
    //重写equals方法
    @Override
    public boolean equals(Object obj) {
        if(obj==null){
            return false;
        }
        //不是同一类型肯定不是同一个对象
        if (!(obj instanceof Teacher)){
            return false;
        }
        // 3. 根据我们的设计类的目的,来判断对象是否代表同一个现实事物
        // 主要名字一样,就代表是同一个现实事物
        Teacher o=(Teacher)obj;
        return this.name.equals(o.name);
    }
}

在这里插入图片描述

  1. 使用比较器Compareable和Comparator也有这个功能可以依据某些属性来比较是否同一对象例如依据年龄,身高,体重等(这就是在我们相比较对象大小又没有重写equals方法,这两个比较器的出现价值就随即而来也是原因)

知道了为什么接下来就说说Compareable和Comparator的用法

Compareable接口

在这里插入图片描述
在这里插入图片描述

public class TestCompareable {
    public static void main(String[] args) {
        Teacher t1=new Teacher("张三",10,170,100);
        Teacher t2=new Teacher("李四",20,160,120);
        int r=t1.compareTo(t2);
        if (r < 0) {
            // 代表的意思就是 t1 指向的对象代表的现实事物 小于 t2 指向的对象代表的现实事物
            System.out.println("张三 小于 李四");
        } else if (r == 0) {
            // 代表的意思就是 t1 指向的对象代表的现实事物 等于 t2 指向的对象代表的现实事物
            System.out.println("高博 等于 陈沛鑫");
        } else {
            // 代表的意思就是 t1 指向的对象代表的现实事物 大于 t2 指向的对象代表的现实事物
            System.out.println("高博 大于 陈沛鑫");
        }
    }
}
//因为是实现Compareable所以必须实现它内部的方法
class Teacher implements Comparable<Teacher>{
    String name;
    int age;
    int height;
    int weight;
    public Teacher(String name, int age, int height, int weight) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }
    @Override
    public int compareTo(Teacher o) {
        if (this.age<o.age){
            return -1;
        }else if (this.age==age){
            return 0;
        }else{
            return 1;
        }
    }
}

在这里插入图片描述

Comparator

在这里插入图片描述

在这里插入图片描述

import java.util.Comparator;

public class TestComparator {
    public static void main(String[] args) {
        Teacher t1=new Teacher("张三",10,170,100);
        Teacher t2=new Teacher("李四",20,160,120);

        Comparator<Teacher> byHeight = new ByHeightComparator();
        Comparator<Teacher> byWeight = new ByWeightComparator();

        int r1=byHeight.compare(t1,t2);
        if (r1>0){
            System.out.println("张三 高于 李四");
        }else if(r1<0){
            System.out.println("张三 低于 李四");
        }else{
            System.out.println("张三 等于 李四");
        }
        int r2=byWeight.compare(t1,t2);
        if (r1>0){
            System.out.println("张三 重于 李四");
        }else if(r1<0){
            System.out.println("张三 轻于 李四");
        }else{
            System.out.println("张三 等于 李四");
        }
    }
}
//通过体重比较
class ByHeightComparator implements Comparator<Teacher> {
    @Override
    public int compare(Teacher o1, Teacher o2) {
        return o1.height - o2.height;
    }
}
//通过身高比较
class ByWeightComparator implements Comparator<Teacher> {
    @Override
    public int compare(Teacher o1, Teacher o2) {
        return o1.weight - o2.weight;
    }
}
class Teacher{
    String name;
    int age;
    int height;
    int weight;
    public Teacher(String name, int age, int height, int weight) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }

}


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值