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

荐 面试官:Comparable和Comparator都不知道,我招你干啥?

程序员文章站 2022-04-15 23:29:15
在实际开发过程中,我们经常会涉及到对对象按某一属性进行比较排序的问题,比如同一类商品按照价格进行排序,或者是学生按照成绩进行排名等等,那么就涉及到对象之间的比较排序问题。 在Java中,实现对象排序的方式有两种:自然排序:java.lang.Comparable定制排序:java.util.Comparator1、自然排序:java.lang.Comparable&...

        在实际开发过程中,我们经常会涉及到对对象按某一属性进行比较排序的问题,比如同一类商品按照价格进行排序,或者是学生按照成绩进行排名等等,那么就涉及到对象之间的比较排序问题。 在Java中,实现对象排序的方式有两种:

  1. 自然排序:java.lang.Comparable
  2. 定制排序:java.util.Comparator

1、自然排序:java.lang.Comparable

        Comparable接口会强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序。例如String类、包装类都实现了Comparable接口重写了CompareTo()方法,而且默认都是从小到大排列的。
        如果我们要对对象进行排序,则需要实现Comparable类,而实现 Comparable类就必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数;如果当前对象this小于形参对象obj,则返回负整数;如果当前对象this等于形参对象obj,则返回零。实现了Comparable接口的对象集合或数组可以通过Collections.sort()或Arrays.sort()进行排序。

//实现Compareable接口,重写compareTo()方法
public class Good implements Comparable<Good>{
    public String name;
    public double price;

    public Good() {
    }

    public Good(String name, double price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Good{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

//重写compareTo方法
    @Override
    public int compareTo(Good good) {
        if (this.price>good.price){
            return 1;
        }else if(this.price<good.price){
            return -1;
        }else{
            return 0;
        }
    }
}

public class CompareTest {
    public static void main(String[] args) {
        Good[] goods =new Good[4];
        goods[0]=new Good("huaweiPhone",5000);
        goods[1]=new Good("vivoPhone",4000);
        goods[2]=new Good("oppoPhone",3000);
        goods[3]=new Good("xiaomiPhone",2000);
        Arrays.sort(goods);
        System.out.println(Arrays.toString(goods));
    }
}

运行结果:
荐
                                                        面试官:Comparable和Comparator都不知道,我招你干啥?

2、定制排序:java.util.Comparator

        当对象的类型没有实现Comparable接口而又不方便修改代码,或者实现了Comparable接口,但排序规则不适合当前的操作,那么可以考虑使用Comparator强行对多个对象进行整体排序。
        当我们实现Comparator接口重写compare(Object o1,Object o2)方法比较o1和o2的大小时,如果方法返回正整数,则表示o1大于o2;如果返回负整数,表示o1小于o2;如果返回0,表示相等。实现了Comparator接口的对象集合或数组可以通过Collections.sort()或Arrays.sort()进行排序。

public class Grade {
    public String name;
    public int score;

    public Grade(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Grade{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}

public class GradeComparator implements Comparator<Grade> {

    @Override
    public int compare(Grade grade1, Grade grade2) {
        if(grade1.score>grade2.score){
            return 1;
        }else if(grade1.score<grade2.score){
            return -1;
        }else{
            return 0;
        }
    }
}

public class CompareTest {
    public static void main(String[] args) {
        Grade[] grades=new Grade[4];
        grades[0]=new Grade("Tom",72);
        grades[1]=new Grade("Marry",66);
        grades[2]=new Grade("Jack",86);
        grades[3]=new Grade("Luck",56);

        Arrays.sort(grades,new GradeComparator());
        System.out.println(Arrays.toString(grades));
    }
}

运行结果如下所示:
荐
                                                        面试官:Comparable和Comparator都不知道,我招你干啥?
总结:
(1)使用Comparable进行排序时,需要对象本身实现Comparable接口并重写compareTo()方法,耦合性较高;而使用Comparator进行排序时,可以在外部实现Comparator接口重写compare()方法,耦合性较低;
(2)如果实现类没有实现Comparable接口,又想对两个类进行比较或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意,那么就可以实现Comparator接口,自定义一个比较器,写比较算法;
(3)Comparable和一个具体类绑定在一起,使用比较固定;而Comparator使用比较灵活,可以被用于各个需要比较功能的类;
(4)如果一个类需要进行多种比较排序,只能使用Comparator,而不能使用Comparable。

本文地址:https://blog.csdn.net/Mr_wxc/article/details/107328572