快捷搜索:  汽车  科技

boss面试怎么显示已面试结束(面试官Comparable和Comparator都不知道)

boss面试怎么显示已面试结束(面试官Comparable和Comparator都不知道)原文链接:https://blog.csdn.net/Mr_wxc/article/details/107328572public 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 '\'' " sc

推荐学习
  • 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银十
  • 算法血拼:Google 百度 Alibaba 字节 Tencent 网易 360 拼夕夕

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

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

boss面试怎么显示已面试结束(面试官Comparable和Comparator都不知道)(1)

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

运行结果:

boss面试怎么显示已面试结束(面试官Comparable和Comparator都不知道)(2)

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

运行结果如下所示:

boss面试怎么显示已面试结束(面试官Comparable和Comparator都不知道)(3)

总结:

  • (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

猜您喜欢: