List集合排序的实现
list集合排序的实现
根据对象属性进行排序
简单说明一下:对list集合中的User进行排序,根据其姓名和年龄进行排序。直接看代码,User类我就不写了
public class ListSort {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
list.add(new User("zs", 24));
list.add(new User("ls", 26));
list.add(new User("ww", 20));
list.add(new User("jq", 25));
list.add(new User("hx", 19));
list.add(new User("ax", 19));
System.out.println("排序前 " + list.toString());
Collections.sort(list);
System.out.println("排序后: " + list.toString());
}
}
这种方法需要User类实现Comparable接口,并实现compareTo()方法,并在此方法内定义排序规则。
//定义排序规则 根据年龄进行排序(从大到小),从小到大只需将this.getAge()和o.getAge()调换位置即可
@Override
public int compareTo(User o) {
return o.getAge() - this.getAge();
}
如果先要按照年龄排序,然后按照姓名排序,则写法如下:
//定义排序规则 这里是先比较年龄再比较姓名
@Override
public int compareTo(User o) {
int i = o.getAge() - this.getAge();
if (i == 0) {
i = o.getName().compareTo(this.getName());
}
return i;
}
简要说明:i是int类型的返回值,1表示大于,0表示等于,-1表示小于。
打印结果如下:
这种写法总归还是麻烦,非要User实现Comparable接口,不太灵活。于是,有了下面的排序方法,这也是JDK1.8的新特性之一。
Lambda表达式
list.sort(((o1, o2) -> {
int i = o1.getAge() - o2.getAge(); //光标调到i的位置
return i;
}));
System.out.println("排序后: " + list.toString());
可以看出,这时候User不需要实现Comparable接口了。取而代之的是,把排序规则写到了Lambda里面。
其实在此基础上还可以进一步简化写法,操作很简单。把鼠标光标调到i的位置,然后一直alt + enter 再回车,就行了,最后会变成如下写法:
list.sort((Comparator.comparingInt(User::getAge)).thenComparing(User::getName));
这样是不是更简洁了呢。不过这样似乎没法倒序排序了,具体实现LZ这里还没有去研究,有兴趣的朋友可以去试试。
还没有评论,来说两句吧...