利用Comparable接口实现对对象数组的排序
柒间 人气:0Arrays 类中的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 }
结果:
注意:
该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。
加载全部内容