comparator 字符串比较大小_干货 | 名企高频考点Java Comparable 和 Comparator

55aa784c7243671d8f932b25b44f10a1.png

点击蓝字关注我哦

a479031a5ca5bf0118c14f28617b3402.png 以下是本期干货视频 视频后还附有文字版本哦 1f6dd1b62c261544d1c5eaca19489662.png 9fc93336836b9ac16cfbe2cd1fd995bc.png ▼ 《名企高频考点-Java Comparable 和 Comparator》 ▼ ps:请在WiFi环境下打开,如果有钱任性请随意 0 概述 在实际项目开发过程中,不仅需要简单类型之间进行比较,有时还需要比较自定义类型。 面试问题:Java当中是如何比较自定义类型的大小呢? 例如:
class Student {    public String name;    public int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}public class TestDemo {    public static void main(String[] args) {        Student student1 = new Student("bit",12);        Student student2 = new Student("gaobo",13);        //代码编译出错        System.out.println(student1 > student2);    }}
在Java中,自定义类型之间不可以通过大于、小于等进行比较。一般有3种对象的比较方式:Comparable ,Comparator 和 equals()。 今天,带大家先了解前两个方式。 1 Comparable接口 准备一个自定义类,并且实现接口 Comparable :
class Student implements Comparable<Student>{    public String name;    public int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public int compareTo(Student o) {        if(this.age > o.age) {            return 1;        }        if(this.age == o.age) {            return 0;        }        return -1;    }}public class TestDemo {    public static void main(String[] args) {        Student student1 = new Student("bit",12);        Student student2 = new Student("gaobo",13);        if(student1.compareTo(student2) > 0 ) {            System.out.println("student1的年龄 > student2的年龄");        }else if(student1.compareTo(student2) == 0){            System.out.println("student1的年龄 == student2的年龄");        }else {            System.out.println("student1的年龄 < student2的年龄");        }    }}
运行程序输出:student1的年龄 < student2的年龄 总结:我们可以看到,这样就能根据年龄进行比较啦,当然也有同学会问,怎么拿姓名比较呢?哎,这也就显现出这个接口的弊端了,如果按照姓名进行比较,我们需要重新实现compareTo方法。 具体如下:
@Overridepublic int compareTo(Student o) {  return this.name.compareTo(o.name);}
它的弊端就是,一旦在类中写死,就只能修改类内部,太不适用了! 2 Comparator 我们接下来看这个接口,它也被叫做比较器(看这个名字就高大上的不行哈~),我们来看看它是怎么实现的。
class Person {    public String name;    public int age;    public int score;    public Person(String name, int age, int score) {        this.name = name;        this.age = age;        this.score = score;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                ", score=" + score +                '}';    }}class AgeComparator implements Comparator<Person> {    @Override    public int compare(Person o1, Person o2) {        //如果从小到大排序 o1.age  < o2.age;  交换        return o1.age-o2.age;    }}class ScoreComparator implements Comparator<Person>{    @Override    public int compare(Person o1, Person o2) {        return o1.score-o2.score;    }}public class TestComparator {  public static void main2(String[] args) {        Person person1 = new Person("gao",14,89);        Person person2 = new Person("bit",54,19);        Person person3 = new Person("hello",24,79);        //根据分数进行比较        ScoreComparator scoreComparator = new ScoreComparator();        System.out.println(scoreComparator.compare(person1,person2));        System.out.println(scoreComparator.compare(person2,person3));        System.out.println(scoreComparator.compare(person1,person3));     }    public static void main1(String[] args) {        Person person1 = new Person("gao",14,89);        Person person2 = new Person("bit",54,19);        Person person3 = new Person("hello",24,79);        //根据年龄进行比较        AgeComparator ageComparator = new AgeComparator();        System.out.println(ageComparator.compare(person1,person2));        System.out.println(ageComparator.compare(person2,person3));        System.out.println(ageComparator.compare(person1,person3));    }}
童鞋们,看到上面的方法是不是觉得很方便,想拿什么比较,自己写个比较器就好,非常便捷。 另外,大博哥再介绍另外一个高级用法:
public static void main(String[] args) {    Person[] people = new Person[3];    people[0] = new Person("gao",14,89);    people[1] = new Person("bit",54,19);    people[2] = new Person("hello",24,79);    ScoreComparator scoreComparator = new ScoreComparator();    Arrays.sort(people,scoreComparator);    System.out.println(Arrays.toString(people));}
我们可以给Arrays.sort()的第二个参数,传入排序的比较器,来规定它的比较方式。 3 总结 综上所述:Java自定义类型的比较,一定要实现这两个接口,具体的要看业务需求。

5525ff7544e8e596887398e97994a600.png

作者:高博 审核:王海斌 编辑:啊琛琛

296bbe18f26ea05d50c3750ee0fd8dec.png

好看,就要点个"在看"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值