Java:Comparator和Comparable使用

Comparable

//源码
public interface Comparable<T> {
    
    
    public int compareTo(T o);
}
  1. Comparable位于包java.lang下
  2. Comparable是排序接口,实现该接口的的类支持排序,接口中通过x.compareTo(y)比较大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。
  3. Comparable是在集合内部实现方法来实现的排序,相当于内部比较器
  4. 一些支持排序的类(String、Integer等)都实现了该接口
  5. 自定义的类通过实现Comparable接口,通过Collections.sort(list)或者Arrays.sort(arr)实现排序。这里调用sort并没有指定Comparator,就是自然排序

Comparator

//源码
public interface Comparator<T> {
    
    
	int compare(T o1, T o2);
	boolean equals(Object obj);
	//默认的倒序方法,可直接通过Comparator实例直接调用
	default Comparator<T> reversed() {
    
    
        return Collections.reverseOrder(this);
    }
    //其他实现的默认方法
    ......
}
  1. Comparator位于java.util包下
  2. Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时(即没有实现Comparable接口,或者实现的compareTo()方式不满足需求),可以用比较器来完成两个对象之间大小的比较。
  3. Comparator 接口中通过int compare(T x, T y)比较大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。
  4. Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为
  5. Comparator相当于外部比较器
  6. 源码中可知Comparator接口中有两个未实现方法 compare和equals,实践中,在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法

简单的实现

class Student implements Comparable<Student>{
    
    
    public int grade;
    public Student(int grade){
    
    
        this.grade=grade;
    }

    @Override
    public int compareTo(Student o) {
    
    
        if(grade>o.grade){
    
    
            return -1;
        }else if(grade<o.grade){
    
    
            return 1;
        }
        return 0;
    }
}

public class Test {
    
    
    public static void main(String[] args){
    
    
        List<Student> list=new ArrayList<>();
        list.add(new Student(70));
        list.add(new Student(60));
        list.add(new Student(90));
        System.out.println("-----未排序-----");
        for(Student student:list){
    
    
            System.out.print(student.grade+" ");
        }

        System.out.println("\n-----Comparable降序排序-----");
        //自然排序
        Collections.sort(list);
        for(Student student:list){
    
    
            System.out.print(student.grade+" ");
        }

        System.out.println("\n-----Comparator升序排序-----");
        //这里是通过匿名类实现的Comparator接口
        //也可以定义一个实现接口的类,这里就不赘述了
        //当然也可以使用lambda,Collections.sort(list, (o1, o2) -> o2.grade - o1.grade);
        //关于lambda也不甚了解,后期再补吧~~~
        //这里也可以看出,在有外部比较器时,sort是优先使用外部比较器的
        Collections.sort(list, new Comparator<Student>() {
    
    
            @Override
            public int compare(Student o1, Student o2) {
    
    
                if(o1.grade<o2.grade)
                    return -1;
                else if (o1.grade>o2.grade)
                    return 1;
                return 0;
            }
        });
        for(Student student:list){
    
    
            System.out.print(student.grade+" ");
        }
    }
}

结果:

-----未排序-----
70 60 90 
-----Comparable降序排序-----
90 70 60 
-----Comparator升序排序-----
60 70 90 

参考

https://blog.csdn.net/mageshuai/article/details/3849143
https://blog.csdn.net/u010859650/article/details/85009595

猜你喜欢

转载自blog.csdn.net/weixin_44759105/article/details/110939644