欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java自定义类型的比较(Comparable和Comparator)

程序员文章站 2022-05-24 18:13:51
...

在实际开发过程中,我们不仅需要对基本数据类型之间进行比较,有时还需要比较自定义类型,那么我们怎样实现自定义类型之间的比较呢?

在java中,自定义类型之间不可以通过大于,小于,等于进行比较。一般情况下,我们会通过下面两种方式实现自定义类型的比较,①实现Comparable接口   ②实现Comparator接口

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方法。

具体如下:


@Override
public 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));
    }
}

上面的方法就比较方便了,想拿什么比较,自己写个比较器就好,非常便捷。

此外此接口还有一个高级用法,我们看下面这个图可以知道,Arrays类的sort()方法有一个可以根据指定的比较器对指定的对象数组进行比较的重载方法,因此我们可以给Arrays.sort()的第二个参数,传入排序的比较器,来规定它的比较方式

Java自定义类型的比较(Comparable和Comparator)

演示如下:

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

3.总结

综上所述:Java自定义类型的比较,一定要实现这两个接口,具体的要看业务需求。

Java自定义类型的比较(Comparable和Comparator)