最近在实际的开发工作中/面试过程中,碰到排序的问题,如题,我们如何针对List集合中的某一个属性进行排序


就是在排序的时候,给sort()方法传入一个比较器。具体来说,就是传入一个实现比较器接口的匿名内部类,目的是告诉sort()方法,按照比较器来对list中的对象进行排序。如下所示:

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

public class Test{
    public static void main(String[] args) {
        ArrayList<Entity> list=new ArrayList<Entity>();
        list.add(new Entity("李四",24));
        list.add(new Entity("张三",13));
        list.add(new Entity("王五",25));
        System.out.println("排序前:"+list);
        Collections.sort(list,new Comparator<Entity>() {
            @Override
            public int compare(Entity o1, Entity o2) {
                if(o1.getAge()>o2.getAge()) {
                    return 1;
                }else if(o1.getAge()<o2.getAge()) {
                    return -1;
                }else{
                    return 0;
                }
            }
        });
        System.out.println("排序后:"+list);
    }
    static class Entity {
        String name;
        Integer age;
        public Entity(String name, Integer age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Entity [name=" + name + ", age=" + age + "]";
        }
    }
}

当给sort()方法传入比较器的时候,sort()方法就会根据比较器来对list中的对象进行排序。

输出结果:

排序前:[Entity [name=李四, age=24], Entity [name=张三, age=13], Entity [name=王五, age=25]]
排序后:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]


在JDK1.8+中,提供了更简便的方法

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

public class Test {

    public static void main(String[] args) {
        ArrayList<Entity> list=new ArrayList<Entity>();
        list.add(new Entity("李四",24));
        list.add(new Entity("张三",13));
        list.add(new Entity("王五",25));
        //1.jdk8 lambda排序,带参数类型
        System.out.println("排序前1:"+list);
        list.sort(( Entity ord1, Entity ord2) -> ord2.getAge().compareTo(ord1.getAge()));
        System.out.println("排序后1:"+list);

        //2.jdk8 lambda排序,不带参数类型
        System.out.println("排序前2:"+list);
        list.sort(( ord1, ord2) -> ord2.getAge().compareTo(ord1.getAge()));
        System.out.println("排序后2:"+list);

        //3.jdk8 升序排序,Comparator提供的静态方法
        System.out.println("排序前3:"+list);
        Collections.sort(list, Comparator.comparing(Entity::getAge));
        System.out.println("排序后3:"+list);

        //4.jdk8 降序排序,Comparator提供的静态方法
        System.out.println("排序前4:"+list);
        Collections.sort(list, Comparator.comparing(Entity::getAge).reversed());
        System.out.println("排序后4:"+list);

        //5.jdk8 组合排序,Comparator提供的静态方法,先按age排序,age相同的按name排序
        System.out.println("排序前5:"+list);
        Collections.sort(list, Comparator.comparing(Entity::getAge).reversed().thenComparing(Entity::getName));
        System.out.println("排序后5:"+list);

    }
    static class Entity {
        String name;
        Integer age;
        public Entity(String name, Integer age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Entity [name=" + name + ", age=" + age + "]";
        }
    }
}

输出结果:

排序前1:[Entity [name=李四, age=24], Entity [name=张三, age=13], Entity [name=王五, age=25]]
排序后1:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序前2:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序后2:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序前3:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序后3:[Entity [name=张三, age=13], Entity [name=李四, age=24], Entity [name=王五, age=25]]
排序前4:[Entity [name=张三, age=13], Entity [name=李四, age=24], Entity [name=王五, age=25]]
排序后4:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序前5:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]
排序后5:[Entity [name=王五, age=25], Entity [name=李四, age=24], Entity [name=张三, age=13]]