Java中几种常见的比较器的实现方法

来源:互联网 发布:the weeknd 知乎 编辑:程序博客网 时间:2024/06/15 08:33

Java中几种常见的比较器的实现方式

在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。

通常对象之间的比较可以从两个方面去看:

第一个方面:对象的地址是否一样,也就是是否引用自同一个对象。这种方式可以直接使用“==“来完成。

第二个方面:以对象的某一个属性的角度去比较。

从最新的JDK8而言,有三种实现对象比较的方法:

一、覆写Object类的equals()方法;二、继承Comparable接口,并实现compareTo()方法;

三、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。


由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。


覆写equals()方法,一般用于自己实现对象数组排序的情况,而对于要使用java内置的排序算法时,使用后面两种方式都是可行的。

先来看第二种方式,这种方式就是让自己编写的类继承Comparable接口,并实现compareTo()方法,这种情况下,在使用java.util.Arrays.sort()

方法时,不用指定具体的比较器,sort()方法会使用对象自己的比较函数来完成对象的排序。下面是一个具体的例子:

[java] view plain copy
  1. import java.util.Arrays;  
  2.   
  3. class BookCook implements Comparable<BookCook>{  
  4.     private String title;  
  5.     private double price;  
  6.     public BookCook(String title,double price){  
  7.         this.title = title;  
  8.         this.price = price;  
  9.     }  
  10.     @Override  
  11.     public String toString() {  
  12.         return "书名:"+this.title+",价格:"+this.price;  
  13.     }  
  14.     @Override  
  15.     public int compareTo(BookCook o) {  
  16.         if(this.price > o.price){  
  17.             return 1;  
  18.         }else if(this.price < o.price){  
  19.             return -1;  
  20.         }else{  
  21.             return 0;  
  22.         }  
  23.     }  
  24. }  


一般我们使用以上两种方法就能够满足实际的开发问题。但是当出现以下情况时,就需要用到Comparator接口:

要在已经开发好的代码的基础上完善对象的比较功能时,又不想更改之前的代码,这种情况下,从JDK1.8之后出现了Comparator接口,是对这种情况的一个弥补。

这种情况下,我们需要单独定义一个对象比较器,继承Comparator接口,并实现compare()方法。示例代码如下:


[java] view plain copy
  1. class Student {  
  2.     private String name;  
  3.     private double score;  
  4.     public Student(String name,double score){  
  5.         this.name = name;  
  6.         this.score = score;  
  7.     }  
  8.     public double getScore(){  
  9.         return this.score;  
  10.     }  
  11.     @Override  
  12.     public String toString() {  
  13.         return "姓名:"+this.name+",分数:"+this.score;  
  14.     }  
  15.       
  16. }  
  17. class StudentComparator implements Comparator<Student> {  
  18.     @Override  
  19.     public int compare(Student o1,Student o2) {  
  20.         if(o1.getScore() > o2.getScore()){  
  21.             return 1;  
  22.         }else if(o1.getScore() < o2.getScore()){  
  23.             return -1;  
  24.         }else{  
  25.             return 0;  
  26.         }  
  27.     }  
  28. }  
  29. public class TestComparator {  
  30.   
  31.     public static void main(String[] args) {  
  32.           
  33.         Student[] sts = new Student[]{  
  34.                 new Student("小戴",60),  
  35.                 new Student("小王",90),  
  36.                 new Student("老王",80),  
  37.                 new Student("小萱",95)  
  38.         };  
  39.           
  40.         java.util.Arrays.sort(sts, new StudentComparator());  
  41.         System.out.println(java.util.Arrays.toString(sts));  
  42.     }  
  43. }  


以上三种情况,因具体情况的不同,选择不同的方法解决实际的问题。

原创粉丝点击