利用Comparable接口实现对对象数组的排序

简介: 利用Comparable接口实现对对象数组的排序

Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口


 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该方法的的参数必须是Object类型对象,返回一个整形数值 。在Java SE 5.0之后Comparable接口已经改进为泛型类型。


1 public interface Comparable<T> {
2     public int compareTo(T o);
3 }


对于compareTo()方法源码是这样写的:


  • int compareTo(T o)

将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。

实现程序必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y。 (这意味着x.compareTo(y)必须抛出异常iff y.compareTo(x)引发异常。)


实施者还必须确保关系是可传递的: (x.compareTo(y)>0 && y.compareTo(z)>0)表示x.compareTo(z)>0 。


最后,实施者必须确保x.compareTo(y)==0意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,对于所有z 。


强烈建议,但不要严格要求(x.compareTo(y)==0) == (x.equals(y)) 。 一般来说,任何实现Comparable接口并违反这种情况的类应清楚地表明这一点。 推荐的语言是“注意:此类具有与equals不一致的自然排序”。


在前面的描述中,符号sgn( ) 表达式表示数学符号函数,其定义根据表达式的值是否为负,零或正返回的-1一个,0,或1。


参数


o - 要比较的对象。


结果


负整数,零或正整数,因为该对象小于,等于或大于指定对象。


异常


NullPointerException - 如果指定的对象为空


ClassCastException - 如果指定的对象的类型阻止它与该对象进行比较。  


实现代码:

 1 package test;
 2 
 3 import java.util.Arrays;
 4 
 5 public class Employee implements Comparable<Employee> {
 6 
 7     int id;
 8 
 9     String name;
10 
11     double salary;
12 
13     public Employee() {
14     }
15 
16     public Employee(int id, String name, double salary) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.salary = salary;
21     }
22 
23     public int getId() {
24         return id;
25     }
26 
27     public String getName() {
28         return this.name;
29     }
30 
31     public double getSalary() {
32         return salary;
33     }
34 
35     public void raiseSalary(double byPercent) {
36         double raise = salary * byPercent / 100;
37         salary += salary;
38 
39     }
40 
41     /*
42      * Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口
43      *
44      * 任何实现Comparable接口的对象都需要实现该方法 并且该方法的的参数必须是Object类型对象,返回一个整形数值
45      */
46     @Override
47     public int compareTo(Employee other) {
48 
49         /*
50          * this.salary < other.salsry 返回 -1 
51          * this.salary = other.salsry 返回 0 
52          * this.salary > other.salsry 返回 1
53          */
54         return Double.compare(this.salary, other.salary);
55     }
56 
57     @Override
58     public String toString() {
59         return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";
60     }
61 
62     public static void main(String[] args) {
63         Employee[] staff = new Employee[3];
64 
65         staff[0] = new Employee(1, "qijian", 15000.0);
66         staff[1] = new Employee(2, "Herry", 13000.0);
67         staff[2] = new Employee(3, "Tom", 14000.0);
68 
69         Arrays.sort(staff);
70 
71         for (Employee e : staff) {
72             System.out.println(e.toString());
73         }
74 
75     }
76 
77 }


结果:


f2b4b6efa9b9b47c1070d13465427b90.png


注意:


 该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。


方法: int compareTo(Object   o)  


利用当前对象和传入的目标对象进行比较:


若是当前对象比目标对象大,则返回1,那么当前对象会排在目标对象的后面


若是当前对象比目标对象小,则返回-1,那么当前对象会排在目标对象的后面


若是两个对象相等,则返回0


相关文章
|
6月前
|
Java
【Java】通过Comparator比较器的方式给对象数组排序
【Java】通过Comparator比较器的方式给对象数组排序
53 0
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
113 0
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
157 0
Java对象的比较和排序(Comparator和Comparable)
|
存储 算法 Java
TreeSet类的排序问题
TreeSet支持两种排序方法:自然排序和定制排序。TreeSet默认采用自然排序。1、自然排序    TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。
1686 0
|
存储 Java 索引
【Java集合类】之TreeSet集合与Comparable/Comparator排序
【Java集合类】之TreeSet集合与Comparable/Comparator排序
150 0
Java集合相关学习——元素排序两大接口Comparable和Comparator的应用及区别
Java集合相关学习——元素排序两大接口Comparable和Comparator的应用及区别
Java集合相关学习——元素排序两大接口Comparable和Comparator的应用及区别
Comparable 接口和 Comparator 接口的实现(十一)
Comparable 接口和 Comparator 接口的实现(十一)
138 0
Comparable 接口和 Comparator 接口的实现(十一)