List集合排序的实现

心已赠人 2022-04-17 06:36 313阅读 0赞

list集合排序的实现

根据对象属性进行排序
简单说明一下:对list集合中的User进行排序,根据其姓名和年龄进行排序。直接看代码,User类我就不写了

  1. public class ListSort {
  2. public static void main(String[] args) {
  3. List<User> list = new ArrayList<>();
  4. list.add(new User("zs", 24));
  5. list.add(new User("ls", 26));
  6. list.add(new User("ww", 20));
  7. list.add(new User("jq", 25));
  8. list.add(new User("hx", 19));
  9. list.add(new User("ax", 19));
  10. System.out.println("排序前 " + list.toString());
  11. Collections.sort(list);
  12. System.out.println("排序后: " + list.toString());
  13. }
  14. }

这种方法需要User类实现Comparable接口,并实现compareTo()方法,并在此方法内定义排序规则。

  1. //定义排序规则 根据年龄进行排序(从大到小),从小到大只需将this.getAge()和o.getAge()调换位置即可
  2. @Override
  3. public int compareTo(User o) {
  4. return o.getAge() - this.getAge();
  5. }

如果先要按照年龄排序,然后按照姓名排序,则写法如下:

  1. //定义排序规则 这里是先比较年龄再比较姓名
  2. @Override
  3. public int compareTo(User o) {
  4. int i = o.getAge() - this.getAge();
  5. if (i == 0) {
  6. i = o.getName().compareTo(this.getName());
  7. }
  8. return i;
  9. }

简要说明:i是int类型的返回值,1表示大于,0表示等于,-1表示小于。
打印结果如下:

在这里插入图片描述

这种写法总归还是麻烦,非要User实现Comparable接口,不太灵活。于是,有了下面的排序方法,这也是JDK1.8的新特性之一。

Lambda表达式

  1. list.sort(((o1, o2) -> {
  2. int i = o1.getAge() - o2.getAge(); //光标调到i的位置
  3. return i;
  4. }));
  5. System.out.println("排序后: " + list.toString());

可以看出,这时候User不需要实现Comparable接口了。取而代之的是,把排序规则写到了Lambda里面。
其实在此基础上还可以进一步简化写法,操作很简单。把鼠标光标调到i的位置,然后一直alt + enter 再回车,就行了,最后会变成如下写法:

  1. list.sort((Comparator.comparingInt(User::getAge)).thenComparing(User::getName));

这样是不是更简洁了呢。不过这样似乎没法倒序排序了,具体实现LZ这里还没有去研究,有兴趣的朋友可以去试试。

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读

    相关 List集合排序

    Java中集合排序,在Java8之前,可以通过 Collections类的sort方法进行排序;Java8之后,新增 lambda和stream ,都增加了相关的排序方法,本文

    相关 List集合排序实现

    list集合排序的实现 根据对象属性进行排序 简单说明一下:对list集合中的User进行排序,根据其姓名和年龄进行排序。直接看代码,User类我就不写了