实现对象数组的排序

实现对象数组的排序有两种方式,让对象继承Comparable接口或者重写Arrays.sort(T[] a, Comparator<? super T> c)中的Comparator方法

继承Comparable接口

继承接口是为了保证继承该接口的类会有CompareTo方法
当调用x.compareTo(y)时,比较的是x和y的内容,若x的内容小于y的内容,返回一个负数,若等于就返回零,若大于就返回一个整数
所以,我个人感觉,在compareTo方法中不一定需要再调用compare去进行比较,可以直接通过x和y内容相减(至于选择x内容减y内容还是y内容减x内容,需要根据想要升序还是降序来决定)
但是有一点需要注意,如果比较的内容是小数,那么需要调用Double.compare(),而不能直接相减
详解见Java核心技术卷1,P229接口的概念

package comapreTest;

import java.util.Arrays;
import java.util.Comparator;

public class Demo11 {
    public static void main(String[] args) {
        Employ a = new Employ(100);
        Employ b = new Employ(101);
        Employ c = new Employ(102);
        Employ[] arr = new Employ[]{a, b, c};

        Arrays.sort(arr);
        for (Employ e : arr) {
            System.out.println(e.getSalary());
        }
    }
}

class Employ implements Comparable {

    private int salary;

    public Employ(int salary){
        this.salary = salary;
    }

    public int getSalary() {
        return salary;
    }

    @Override
    public int compareTo(Object other) {
        Employ e = (Employ) other;
//        return Double.compare(salary, e.salary);
//        return salary - e.salary;
        return e.salary - salary;
    }
}

重写Arrays.sort(T[] a, Comparator<? super T> c)中的Comparator

我在LeetCode做题的时候用的就是这种方法,只不过当时不理解
是通过匿名类实现一个接口

package comapreTest;

import java.util.Arrays;
import java.util.Comparator;

public class Demo12 {
    public static void main(String[] args) {
        Employ2 d = new Employ2(200);
        Employ2 e = new Employ2(201);
        Employ2 f = new Employ2(202);

        Employ2[] arr2 = new Employ2[]{d, e, f};
        Arrays.sort(arr2, new Comparator<Employ2>() {
            @Override
            public int compare(Employ2 o1, Employ2 o2) {
//                return o1.getSalary() - o2.getSalary();
                return o2.getSalary() - o1.getSalary();
            }
        });

        for (Employ2 e2 : arr2) {
            System.out.println(e2.getSalary());
        }
    }
}

class Employ2 {

    private int salary;

    public Employ2(int salary){
        this.salary = salary;
    }

    public int getSalary() {
        return salary;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。