zoukankan      html  css  js  c++  java
  • 利用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))所有xy。 (这意味着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方法被称为其自然比较方法

    方法: int compareTo(Object   o)  

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

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

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

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

  • 相关阅读:
    sqlserver中临时表、row-number、update更新自己
    easyui 实现Tooltip
    easyui 添加dialog
    转载 50种方法优化SQL Server数据库查询
    用正则将空格给去掉
    java连接redis无法连接,报异常RedisConnectionException
    springcloud的Turbine配置监控多个服务的一些坑!!!!InstanceMonitor$MisconfiguredHostException,No message available","path":"/actuator/hystrix.stream,页面不显示服务或者一直loading
    CentOS7最小化安装之后无法联网以及无法使用ifconfig以及无法使用yum安装软件
    required_new spring事务传播行为无效碰到的坑!
    推荐一下牛逼的谷歌浏览器插件!!!非常好用
  • 原文地址:https://www.cnblogs.com/cnqijian/p/14211626.html
Copyright © 2011-2022 走看看