Java中常见的⽐较器的实现⽅法
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的⽐较问题。
通常对象之间的⽐较可以从两个⽅⾯去看:
第⼀个⽅⾯:对象的地址是否⼀样,也就是是否引⽤⾃同⼀个对象。这种⽅式可以直接使⽤“==“来完成。
第⼆个⽅⾯:以对象的某⼀个属性的⾓度去⽐较。
对于JDK8⽽⾔,有三种实现对象⽐较的⽅法:
1、覆写Object类的equals()⽅法;
2、继承Comparable接⼝,并实现compareTo()⽅法;
3、定义⼀个单独的对象⽐较器,继承⾃Comparator接⼝,实现compare()⽅法。
由于使⽤的排序⽅式的不同,具体选择哪种⽅法来实现对象的⽐较也会有所不同。
第⼀种⽅法⽐较便于理解,复写equals()⽅法⼀般⽤于⾃⼰实现的对象数组排序,⽽对于在应⽤Java内置的排序算法时,使⽤后两种⽅式都是可以实现的。
先来看⼀下第⼆种⽅式,这种⽅式就是让⾃⼰编写的类继承Comparable接⼝,并实现接⼝的compareTo()⽅法,这种情况下,在使⽤java.util.Arrays.sort()⽅法时不⽤指定具体的⽐较器,sort()⽅法会使⽤对象⾃⼰的⽐较函数对对象进⾏排序。具体实例代码如下:
1import java.util.Arrays;
2
3class BookCook implements Comparable<BookCook>{
4private String title;
5private double price;
6public BookCook(String title,double price){
7this.title = title;
8this.price = price;
9  }
10  @Override
11public String toString() {
12return "书名:"+this.title+",价格:"+this.price;
13  }
14  @Override
15public int compareTo(BookCook o) {
16if(this.price > o.price){
17return 1;
18  }else if(this.price < o.price){
19return -1;
20  }else{
21return 0;
22  }
23  }
24 }
从JDK1.8开始出现了Comparator接⼝,它的出现解决了当需要在已经开发好的代码基础上完善对象的⽐较功能时不想更改之前的代码的问题。这种情况,我们需要单独定义⼀个对象⽐较器,继承Comparator接⼝。具体实现代码如下:
1class Student {
2private String name;
3private double score;
4public Student(String name,double score){
5this.name = name;
6this.score = score;
7  }
8public double getScore(){
9return this.score;
10  }
11  @Override
12public String toString() {
13return "姓名:"+this.name+",分数:"+this.score;
14  }
15
16 }
17class StudentComparator implements Comparator<Student> {
java的tostring方法18  @Override
19public int compare(Student o1,Student o2) {
Score() > o2.getScore()){
21return 1;
22  }else Score() < o2.getScore()){
23return -1;
24  }else{
25return 0;
26  }
27  }
28 }
29public class TestComparator {
30
31public static void main(String[] args) {
32
33  Student[] sts = new Student[]{
34new Student("⼩戴",60),
35new Student("⼩王",90),
36new Student("⽼王",80),
37new Student("⼩萱",95)
38  };
39
40  java.util.Arrays.sort(sts, new StudentComparator());
41  System.out.println(java.String(sts));
42  }
43 }
以上三种情况,因具体情况的不同,选择不同的⽅法解决实际的问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。