Java之list排序浅析

本文介绍了在Java中对List进行排序的三种方法:使用Comparable接口、使用Comparator接口以及使用JDK 8中的Stream API。通过具体示例展示了每种方法的应用场景及其实现细节。

在java日常开发中,会遇到对ist进行排序处理的需求,下面对其解决方式进行浅析。
List 排序指的是将 List 中的对象按某个字段进行排序的过程。
实现方式有3种思路,1使用Comparable;2使用Comparator;3使用jdk8中stream流的排序功能。
实例1:使用Comparable

public class SortTest {

    public static void main(String[] args) {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
        // 使用 Comparable 自定的规则进行排序
        Collections.sort(list);
        // 打印 list 集合
        list.forEach(p -> { System.out.println(p); });
    }
}

class Person implements Comparable<Person> {
    private int id;
    private int age;
    private String name;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

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

    @Override
    public int compareTo(Person p) {
        return p.getAge() - this.getAge();
    }
}

Comparable 是类内部的比较方法,需要自定义比较方法。
实例2:使用Comparator

public class SortTest2 {

    public static void main(String[] args) {
        // 创建并初始化 List
        List<Person2> list = new ArrayList<Person2>() {{
            add(new Person2(1, 30, "北京"));
            add(new Person2(2, 20, "西安"));
            add(new Person2(3, 40, "上海"));
        }};
        // 使用 Comparator 比较器排序
        //Collections.sort(list, new PersonComparator());
        // 使用匿名比较器排序
        Collections.sort(list, new Comparator<Person2>() {
            @Override
            public int compare(Person2 p1, Person2 p2) {
                return p2.getAge() - p1.getAge();
            }
        });
        // 打印 list 集合
        list.forEach(p -> { System.out.println(p); });
    }
}

class Person2 {
    private int id;
    private int age;
    private String name;

    public Person2(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

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

}

class PersonComparator implements Comparator<Person2> {
    @Override
    public int compare(Person2 p1, Person2 p2) {
        return p2.getAge() - p1.getAge();
    }
}

实例3:使用stream流

public static void main(String[] args) {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
        // 使用 Stream 排序
        list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
        //list = list.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
        // 打印 list 集合
        list.forEach(p -> { System.out.println(p); });
    }

其中 reversed() 表示倒序的意思,如果不使用此方法则是正序。
测试结果

Person{id=3, age=40, name='上海'}
Person{id=1, age=30, name='北京'}
Person{id=2, age=20, name='西安'}

推荐使用stream流的方式,继续理解其他方式的原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值