Java(28)java比较器

JAVA比较器

java的比较器主要分为两种,第一种是实现Comparable接口的内部比较器,第二种是实现Comparator接口的外部比较器。

Comparabel接口的部分源码如下:

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

Comparator接口的部分源码如下:

public interface Comparator<T> {
    int compare(T o1, T o2);
}

内部比较器--Comparable接口

Comparable接口位于java.lang包下。

当需要对某个类(可以是自己定义的)的对象进行排序时候,则需要实现Comparable这个接口,然后重写compareTo方法。我们的类实现这个接口和重写方法后,就可以使用Array.sort()对这个类的实例对象数组进行排序,或者使用Collection.sort对这个类的对象List集合进行排序。我们需要在compareTo方法里定义我们的排序规则。注意:自定义类的时候最好重写顶级父类ObjecttoString()方法。

案例1:内部比较器

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Employee implements Comparable<Employee> { //这里记得要指定泛型
    private String name;
    private int id;
    private long salary;

    public Employee(String name, int id, long salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    @Override
    public int compareTo(Employee o) {
        if (this.salary > o.salary) {
            return (1);
        } else if (this.salary < o.salary) {
            return (-1);
        } else {
            return (0);
        }
    }
    //默认的toString()方法,调用顶级父类Object的toString()方法
//    @Override
//    public String toString() {
//        return super.toString();
//    }

    //super.toString(),父类Object的toString源码如下,该方法默认返回类名和hashCode相关信息
//    public String toString() {
//        return getClass().getName() + "@" + Integer.toHexString(hashCode());
//    }

    //重写toString()方法

    @Override
    public String toString() {
        return (this.name+"\t"+this.id+"\t"+this.salary);
    }
}

class RunClass {
    public static void main(String[] args) {
        Employee[] ems = {
                new Employee("zhansan", 23522, 20000),
                new Employee("lisi", 23436, 24000),
                new Employee("laowang", 235634, 10000)
        };
        System.out.println("===============使用Arrays.sort()来进行排序");
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Arrays.sort(ems);
        System.out.println("==============");
        //排序后
        for(Employee e:ems){
            System.out.println(e.toString());
        }

        System.out.println("===============使用Arrays.sort()来进行排序");
        List<Employee> myList=new ArrayList<Employee>();
        myList.add(new Employee("zhansan", 23522, 20000));
        myList.add(new Employee("lisi", 23436, 24000));
        myList.add(new Employee("lisi", 23436, 24000));
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Collections.sort(myList);
        System.out.println("==============");
        //排序后
        for(Employee e:ems){
            System.out.println(e.toString());
        }

    }
}

运行输出结果如下:

===============使用Arrays.sort()来进行排序
zhansan	23522	20000
lisi	23436	24000
laowang	235634	10000
==============
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000
===============使用Arrays.sort()来进行排序
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000
==============
laowang	235634	10000
zhansan	23522	20000
lisi	23436	24000

外部比较器--Comparator接口

Comparator接口位于java.util包下。

Comparator接口是一个跟Comparable接口功能很相近的比较器。比较大的区别是,实现该接口的类一般是一个独立的类。详情看代码:

import java.util.*;

class Employee{
    private String name;
    private int age;
    private long salary;
    public Employee(String name,int age,long salary){
        this.salary=salary;
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public long getSalary() {
        return salary;
    }

    @Override
    public String toString() {
        return this.name+"\t"+this.age+"\t"+this.salary;
    }
}
//创建年龄比较器:
class AgeComparator implements Comparator<Employee>{

    @Override
    public int compare(Employee o1, Employee o2) {
        if (o1.getAge()>o2.getAge()){
            return 1;
        }else if(o1.getAge()<o2.getAge()){
            return -1;
        }else {
            return 0;
        }
    }
}
//创建薪水比较器:
class SalaryComparator implements Comparator<Employee>{

    @Override
    public int compare(Employee o1, Employee o2) {
        if (o1.getSalary() > o2.getSalary()) {
            return 1;
        } else if (o1.getSalary() < o2.getSalary()) {
            return -1;
        } else {
            return 0;
        }
    }
}

class RunClass {
    public static void main(String[] args) {
        Employee[] ems = {
                new Employee("zhansan", 26, 30000),
                new Employee("lisi",14, 24000),
                new Employee("laowang",40, 10000)
        };
        System.out.println("===============使用薪水比较器来进行排序");
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Arrays.sort(ems,new SalaryComparator());  //使用薪水比较器进行排序
        System.out.println("==============");
        //排序后
        for(Employee e:ems){
            System.out.println(e.toString());
        }

        System.out.println("===============使用年龄比较器来进行排序");
        List<Employee> myList=new ArrayList<Employee>();
        myList.add(new Employee("zhansan", 23522, 20000));
        myList.add(new Employee("lisi", 23436, 24000));
        myList.add(new Employee("lisi", 23436, 24000));
        //排序前
        for(Employee e:ems){
            System.out.println(e.toString());
        }
        Collections.sort(myList,new AgeComparator()); //使用年龄比较器进行排序

        System.out.println("==============");
        //排序后
        for(Employee e:ems){
            System.out.println(e.toString());
        }

    }
}

运行输出结果如下:

===============使用薪水比较器来进行排序
zhansan	26	30000
lisi	14	24000
laowang	40	10000
==============
laowang	40	10000
lisi	14	24000
zhansan	26	30000
===============使用年龄比较器来进行排序
laowang	40	10000
lisi	14	24000
zhansan	26	30000
==============
laowang	40	10000
lisi	14	24000
zhansan	26	30000

内部与外部比较器的区别

如果定义一个类的时候,没有考虑到排序的问题,即没有实现Comparable接口,那么就可以通过实现Comparator接口来来进行自定义排序。Comparator可以方便使用不同的排序规则,更加灵活一点。

posted @ 2020-08-29 10:03  Whatever_It_Takes  阅读(618)  评论(0编辑  收藏  举报