关于Comparable和Comparator的应用

98 阅读2分钟

关于Comparable和Comparator的应用

在学习集合时常常会使用一个Collections.sort()方法,如果集合中存放的是一些Object之类的对象,那么使用Collections还有作用吗?

java为此给我们提供了两个接口,分别是Comparable和Comparator接口来实现排序

Comparable接口

1.处于java.long包下 2.内部排序,在自定义的对象的类中实现 3.重写CompareTo方法进行比较 比如 自定义类

package Comparable;

public class Student implements Comparable<Student>{
    private int age;
    private int grade;
    private String name;

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

    public int getAge() {
        return age;
    }

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

    public int getGrade() {
        return grade;
    }

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

    public String getName() {
        return name;
    }

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

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



    @Override
    public int compareTo(Student o) {
        if (this.age==o.age){
            if (this.grade==o.grade){
                return this.name.compareTo(o.name);
            }
            return this.grade-o.grade;
        }else{
            return this.age-o.age;
        }

    }
}

main

package Comparable;

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

public class Test {
    public static void main(String[] args) {
        List<Student>list=new ArrayList<Student>();
        Student student1 = new Student(12,12, "a");
        Student student2 = new Student(12,12, "aa");
        Student student3 = new Student(12,13, "aa");
        Student student4 = new Student(12,13, "aaa");
        Student student5 = new Student(13,13, "aaa");
        Student student6 = new Student(12,13, "a");
        Student student7 = new Student(13,13, "a");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        list.add(student5);
        list.add(student6);
        list.add(student7);
        Collections.sort(list);
        for (Student s:list){
            System.out.println(s);
        }
    }
}

控制台显示

image.png

排序成功

Comparator接口

1.在java.util包下 2.可以在外部实现排序 3.实现compare方法来实现排序 4.可以采用匿名内部类来实现

由于Collections.sort()有两个重载方法

image.png 第一个方法的使用和Comparable相似 这里展示第二种方法

package comparator;

public class Student{
    private int age;
    private int grade;
    private String name;

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

    public int getAge() {
        return age;
    }

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

    public int getGrade() {
        return grade;
    }

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

    public String getName() {
        return name;
    }

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

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

}
package comparator;

import comparator.Student;

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

public class Test {
    public static void main(String[] args) {
        List<Student>list=new ArrayList<>();
        Student student1 = new Student(12,12, "a");
        Student student2 = new Student(12,12, "aa");
        Student student3 = new Student(12,13, "aa");
        Student student4 = new Student(12,13, "aaa");
        Student student5 = new Student(13,13, "aaa");
        Student student6 = new Student(12,13, "a");
        Student student7 = new Student(13,13, "a");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        list.add(student5);
        list.add(student6);
        list.add(student7);
        Collections.
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.getAge()==o2.getAge()){
                    if (o1.getGrade()==o2.getGrade()){
                        return o1.getName().compareTo(o2.getName());
                    }
                    return o1.getGrade()-o2.getGrade();
                }else{
                    return o1.getAge()-o2.getAge();
                }

            }
        });
        for (Student s:list){
            System.out.println(s);
        }
    }
}

这里使用了匿名内部类,也可以将Comparator单独写成一个比较类然后将其传给Collection.sort(List,Comparator),里面也可以,Comparator比comparable灵活