Comparable 和 Compator的区别

  • 1. Comparable 

  • 2. Compator

  • 3. Comparable 和 Compator 的区别 

1.Comparable 是一个接口,代码如下, 其中T就是要比较的对象。

public interface Comparable<T> {
    public int compareTo(T o);
}

对于一个类Person 有两个属性 年龄和姓名,需求是我们根据其中的年龄进行排序。

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

要比较,我们需要对用Person类实现Comparable接口,我们再代码里用到了Arrays.sort()来对数组进行排序,数组中的每个元素是实现了Comparable接口的对象,具体代码如下:

import java.util.Arrays;

public class Person implements Comparable<Person> {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(@NotNull Person o) {
        return this.age - o.getAge();
    }

    public static void main(String[] args) {
        Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
        System.out.println("原来的顺序");
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
        System.out.println();
        System.out.println("后来的顺序");
        Arrays.sort(personArray);
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
    }
}

运行结果如图 : 

我们可以看到要对对象进行排序,需要更改该对象对应的类的源码

2.Compator 

Comapator接口,该接口有个compare 方法, 我们写的实现类只需重写该方法就可以了

public interface Comparator<T> {
    int compare(T o1, T o2);
    其余的一些方法...
}

但是Compator 接口也有更多的 其他方法,感兴趣的可以去看看

Person 类

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

}

 我们只需写一个比较器类,该类实现了Compator<T> 接口即可。

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

public class ComparatorPerson implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() -  o2.getAge();
    }

    public static void main(String[] args) {
        Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
        System.out.println("原来的顺序");
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
        System.out.println();
        System.out.println("后来的顺序");
        Arrays.sort(personArray, new ComparatorPerson());
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
    }
}

得出的结果是和使用Comparable结果是一致的,只是这个地方不用再源码Person上修改代码,而是新建一个比较器类

3.Comparable和Compator两个的区别

Comparable 的使用,我们需要在源码Person上重写compareTo方法,而在Compator的使用中我们无需在源码Person上重写相关的方法,而是只需要新建一个比较器类即可,该比较器实现了Compator接口的compare方法。所以Comparable可以称之为内部比较器,而Compator可以称之为外部比较器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章