zoukankan      html  css  js  c++  java
  • java> Comparable接口和Comparator接口

    java中,如何利用现有数据结构对对象数组Arrays进行排序?
    利用Arryas.sort()方法排序,需要结合有两种常用方法:1.使用Comparable接口;2.使用Comparator接口;

    2种方法共同点

    1. 都支持泛型;
    2. 都是需要实现接口方法compareTo();
    3. 都需要利用Arrays.sort()对数组进行排序;

    2种方法不同点

    1. Comparable需要修改待排序的对象,也就是要让待排序对象实现Comparable接口方法。而Comparator不影响原来的对象,新建类实现该接口即可;
    2. 实现Comparable的compareTo(T t)接口只需要传入1个参数,因为另外一个对象就是当前对象(this)。实现Comparator的compareTo(T t1, T t2)需要传入2个参数,因为当前对象并不是待排序对象;

    Comparable使用方法

    步骤

    1. 待排序数组对象实现接口Comparable
    2. 实现compareTo方法,将当前对象与形成对象进行比较,较小者将会排在前面(按递增顺序);
    3. 利用Arrays.sort对数组进行递增排序,本质是用快速排序方法;
    4. 检查排序结果;

    例子

    假设需要对一个Employee数组进行排序,按薪水高低排序,薪水较小的排在前,较大排在后.
    使用Comparable接口,需要待排序对象实现compareTo(T obj)方法,用于比较当前对象和传入对象。其中,T所指类型,要与compareTo形参类型一致。

    public class Employee implements Comparable<Employee> {
        private String name;
        private double salary;
        
        public Employee (String name, double salary) {
            this.name = name;
            this.salary = salary;
        }
        
        public int getSalary(){
            return salary;
        }
        public int getName() {
            retunr name;
        }
        
        @override
        public int compareTo(Employee other) {
            return Double.compare(e.getSalary(), other.getSalary());
        }
    }
    

    静态函数Arrays.sort()是对数组对象进行快速排序,要求对象必须实现了Comparable接口,而且元素之间比较是通过compareTo进行。
    当进行x.compareTo(y)时,如果y是x子类则没有问题,而如果y是x父类,则会出现异常。

    public class EmployeeTest{
        public void main(String[] argv) {
            // create data source
            Employee[] employees = new Employee[3];    
            employees[0] = new Employee("henrry", 15000);    
            employees[1] = new Employee("jok", 20000);    
            employees[2] = new Employee("martin", 13000);    
            
            Arrays.sort(employees);  // sort
            for (Employee e : employees) {       // check result
                System.out.println("name = " + e.getName() + ", salary = " + e.getSalary());    
            }
        }
    }
    

    运行输出

    name = martin, salary = 13000.0
    name = henrry, salary = 15000.0
    name = jok, salary = 20000.0
    

    Comparator用法

    步骤

    1. 创建待排序数组对象;
    2. 创建待排序对象的排序对象,实现接口 Comparator
    3. 实现compareTo方法,将传入2个同样对象参数进行比较,较小者将会排在前面(按递增顺序);
    4. 利用Arrays.sort对数组进行递增排序,本质是用快速排序方法;
    5. 检查排序结果;

    例子

    还是跟Comparable一样的需求例子,不过实现会有差异。待排序类Employee不再实现Comparable或者Comparator接口。

    public class Employee {
        private String name;
        private double salary;
        
        public Employee(String name, double salary) {
            this.name = name;
            this.salary = salary;
        }
        
        public String getName() {
            return name;
        }
        public double getSalary() {
            return salary;
        }
    }
    
    public class EmployeeComparator implments Comparator<Employee> {
        @Override
        public int compareTo(Employee e1, Employee e2) {
            return return Double.compare(e1.getSalary() , e2.getSalary());
        }
    }
    
    public class EmployeeComparatorTest {
        public void main(String [] argvs) {
            // create data source
            Employee[] employees = new Employee[3];    
            employees[0] = new Employee("henrry", 15000);    
            employees[1] = new Employee("jok", 20000);    
            employees[2] = new Employee("martin", 13000);    
            
            Arrays.sort(employees, new EmployeeComparator());  // sort
            for (Employee e : employees) {       // check result
                System.out.println("name = " + e.getName() + ", salary = " + e.getSalary());    
            } 
        }
    }
    
    

    运行结果(与Comparable的例子一样))

    name = martin, salary = 13000.0
    name = henrry, salary = 15000.0
    name = jok, salary = 20000.0
    

    注意:
    x.compareTo(y)会将y转换成x的同类型进行比较,也就是说如果x是y的基类,则没有问题;
    如果反过来,y.compareTo(x),x还是y的基类就会出现异常,因为会先将x转换成y的同类型;

  • 相关阅读:
    fiddler过滤css、js、jpg等文件。
    利用jmeter批量创建测试数据(一)---csv data set config
    【Qt】实现程序重启的两种方法
    【MySQL 基础】MySQL必知必会
    【设计模式】访问者模式
    【设计模式】状态模式
    【设计模式】观察者模式
    【设计模式】备忘录模式
    【设计模式】中介者模式
    【设计模式】迭代器模式
  • 原文地址:https://www.cnblogs.com/fortunely/p/13722026.html
Copyright © 2011-2022 走看看