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中,实现对象排序的方式有两种:
- 自然排序:java.lang.Comparable
- 定制排序:java.util.Comparator
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接口而又不方便修改代码,或者实现了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));
}
}
运行结果如下所示:
总结:
- (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