Java比较器

Java比较器

Comparable接口(自然排序)

String、包装类等排序

像String、包装类等实现了Comparable接口,进而重写了compareTo()方法,给出了比较两个对象大小的方式(从小到大的排列)

  • compareTo(obj)重写规则
    • 如果当前对象this大于形参对象obj,则返回正整数
    • 如果当前对象this小于形参对象obj,则返回负整数
    • 如果当前对象this等于形参对象obj,则返回0

自定义类排序

对于自定义类来说,如果需要排序。可以让自定义类实现comparable接口,重写CompareTo(obj)方法

  • 在compareTo(obj)方法中指明如何排序
    • 首先判断数据是否可以转化为同一类型(数据类型转换)
    • 判断当前对象和形参对象数据大小关系
      • 如果当前对象this大于形参对象obj,则返回正整数
      • 如果当前对象this小于形参对象obj,则返回负整数
      • 如果当前对象this等于形参对象obj,则返回0

代码实现

按照年龄从小到大进行排列

public class Test {
    public static void main(String[] args) {
        Student[] arr = new Student[4];
        arr[0] = new Student("Tom",18,100);
        arr[1] = new Student("Jack",23,60);
        arr[2] = new Student("Ann",20,41);
        arr[3] = new Student("Lisa",21,82);

        Arrays.sort(arr);

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }
}

class Student implements Comparable {
    private String name;
    private int age;
    private double grade;

    public Student() {

    }

    public Student(String name, int age, double grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getGrade() {
        return grade;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", grade=" + grade +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        //数据进行类型转换
        if(o instanceof Student){
            Student s = (Student)o;
            //进行比较
            if(s.getAge() > this.getAge()){
                return -1;
            }else if(s.getAge() < this.getAge()){
                return 1;
            }else{
                return 0;
            }
        }else{
            throw new RuntimeException("传入数据类型不一致");
        }

    }
}

运行结果

1.png

Comparator接口(定制排序)

背景(以下情况使用Comparator接口)

  1. 当元素没有实现Comparable接口而又不方便修改代码
  2. 实现了Comparable接口的排序规则不适合当前操作

重写compare方法

重写compare(Object o1,Object o2)方法,比较o1和o2的大小

  • 如果o1大于o2,则返回正整数
  • 如果o1小于o2,则返回负整数
  • 如果o1等于o2,则返回0

String类重写

代码实现

public void test1(){
    String[] s = new String[]{"AA","YY","NN","EE","XX"};
    Arrays.sort(s, new Comparator() {
        @Override
        public int compare(Object o1 , Object o2) {
            if(o1 instanceof String || o2 instanceof String){
                String s1 = (String)o1;
                String s2 = (String)o2;

                if(s1.equals(s2)){
                    return 0;
                }else{
                    return - s1.compareTo(s2);
                    }
                }
            else{
                throw new RuntimeException("传入数据类型不一致");
            }
        }
    });

    System.out.println(Arrays.toString(s));
}

运行结果

2.png

自定义类重写

代码实现

3.png
4.png

Comparable接口和Comparator接口对比

  1. Comparable接口方式一旦指定,保证Compareable接口实现类在任何位置都可以比较大小
  2. Comparator接口属于临时性的比较,什么时候需要比较就临时创建一下
posted @ 2020-07-19 11:47  南煎丸子  阅读(149)  评论(0编辑  收藏  举报