首页
编程语言

分类

当前位置: 天天编程网 > 技术新闻 > 编程语言 >正文

比较器-Comparable和Comparator

更新时间:2024-11-14  作者:佚名   来源: 网络转载

比较器-Comparable和Comparator

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序

1.Comparable接口

使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样

注意:

public class Person implements Comparable<Person>{

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name="" + name + """ +
                ", age=" + age +
                "}";
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else {
            return -1;
        }
//        return Integer.compare(this.age, o.age);
    }
}


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people);
    System.out.println(Arrays.toString(people));
}

Comparable接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。

2.Comparator接口

Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。

使用场景:假如说我们有这样一个需求,需要对Person类的年龄进行排序,但是Person类是别人写好的,里面没有Comparable接口,如果在不允许改变源代码的情况下,我们可以使用Comparator接口。

public class Person {

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name="" + name + """ +
                ", age=" + age +
                "}";
    }
}

public class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        return Integer.compare(o1.getAge(), o1.getAge());
    }
}


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, new PersonComparator()); // 这里需要加入比较器
    System.out.println(Arrays.toString(people));
}

// 当然上述的类为了方便查看,所以专门写出来,可以看到PersonComparator类中只有一个方法,可以使用匿名类的方式来进行编写

public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("张三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 这样写就不需要类比较器了
//    Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最简写法
    System.out.println(Arrays.toString(people));
}

总结
Comparable和Comparator的区别:

java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。

java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。

在设计阶段,我们使用比较多的是Comparable接口。

但在实际开发过程中的话,我们通常使用匿名内部类的方式,所以更多使用的是Comparator,不过一般是在算法题中使用,真正在项目中使用的情况确实不多。

参考:

https://blog.csdn.net/qq_41474648/article/details/105182845

上一篇:[这可能是最好的Spring教程!]Maven的模块管理——如何拆分大项目并且用parent继承保证代码的简洁性 下一篇:JAVA开发规范
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

天天编程网 版权所有

陕ICP备2023002928号-1