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