Java基础系列—List排序

Collectins工具类如下提供排序方法:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}


public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}
复制代码
  • 使用方法一时对象T必需实现Comparable接口否则编译不通过,排序时使用Comparable的compareTo(T o)进行元素大小比较;

  • 方法二需要显式指定比较器(实现了Comparator接口),排序时使用指定比较器的compare(T o1, T o2)方法进行元素大小比较;

自定义对象排序的例子

public class ObjectSort {

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("0022", "zhangsan"));
        students.add(new Student("0001", "lisi"));
        students.add(new Student("0012", "xiaozhang"));
        students.add(new Student("0002", "xiaozhao"));
        Collections.sort(students);
        for (Student s : students) {
            System.out.println(s.getNo() + "," + s.getName());
        }
    }
}

class StudentComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        Integer no1 = Integer.valueOf(o1.getNo());
        Integer no2 = Integer.valueOf(o2.getNo());
        return no1 > no2 ? 1 : (no1.equals(no2)) ? 0 : -1;
    }
}

class Student implements Comparable<Student> {

    private String no;

    private String name;

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

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

    public Student(String no, String name) {
        this.no = no;
        this.name = name;
    }

    @Override
    public int compareTo(Student o) {
        return new StudentComparator().compare(this, o);
    }
}
复制代码

根据运行结果可以发现,默认是按照升序进行排序的。而在实际应用中经常是按照倒序排序,该如何解决呢?

  • 调用Collections.reverse(List<?> list)方法将升序排序结果进行倒转,但效率不高;

  • 修改StudentComparator类的compare方法,代码如下:

class StudentComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        Integer no1 = Integer.valueOf(o1.getNo());
        Integer no2 = Integer.valueOf(o2.getNo());
        // 取反
        return -(no1 > no2 ? 1 : (no1.equals(no2)) ? 0 : -1);
    }
}
复制代码

总结

1、推荐使用显式指定比较器方法,Comparable的compare方法已实现或防止compare方法被修改的可能;

2、Collectins工具类的sort方法的过程是首先将List转换成数组,然后选择排序方法对数组进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值