最近在实际的开发工作中/面试过程中,碰到排序的问题,如题,我们如何针对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]]