• Java中List排序的3种方法!


    在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。List 排序的常见方法有以下 3 种:

    使用 Comparable 进行排序;

    使用 Comparator 进行排序;

    如果是 JDK 8 以上的环境,也可以使用 Stream 流进行排序。

    下面我们分别来看各种排序方法的具体实现。

    新建实体类如下:

    //以下 set/get/toString 使用的是 lombok 的注解
    @Getter
    @Setter
    @ToString
    class Person  implements Comparable<Person> {
        private Integer age;
        private String name;
    
        public Person(Integer age, String name)  {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public int compareTo(Person p) {
            return p.getAge() - this.getAge();
        }
    }

    1.使用 Comparable 排序

    class  TestDemo{
        public static void main(String[] args) {
    // 创建并初始化 List
            List<Person> list = new ArrayList<Person>() {{
                add(new Person(30, "Jesse"));
                add(new Person(10, "luxi"));
                add(new Person(40, "Jack"));
          }};
     // 使用 Comparable 自定的规则进行排序
         Collections.sort(list);
         // 打印 list 集合
            list.forEach(p -> {
                System.out.println(p);
            });
    }
    }
    

      

    2.使用 Comparator 排序

    /**
     * 新建 Person 比较器
     */
    class PersonComparator implements Comparator<Person> {
        @Override
        public int compare(Person p1, Person p2) {
            return p2.getAge() - p1.getAge();
        }
    }
      
    
    class  TestDemo{
        public static void main(String[] args) {
    
    // 创建并初始化 List
            List<Person> list = new ArrayList<Person>() {{
                add(new Person(30, "Jesse"));
                add(new Person(10, "luxi"));
                add(new Person(40, "Jack"));
            }};
        //新建 Person 比较器
        Collections.sort(list,new PersonComparator());
          //或者
          // 使用匿名比较器排序
            Collections.sort(list, new Comparator<Person>() {
                @Override
                public int compare(Person p1, Person p2) {
                    return p2.getAge() - p1.getAge();
                }
            });
       // 打印 list 集合 
        list.forEach(p -> { System.out.println(p); }); 
    } } 
    

      

    3.使用 Stream 流排序

    class  TestDemo{
        public static void main(String[] args) {
    
    // 创建并初始化 List
            List<Person> list = new ArrayList<Person>() {{
                add(new Person(30, "Jesse"));
                add(new Person(10, "luxi"));
                add(new Person(40, "Jack"));
                add(new Person(null, "marry"));
          }}; 
       // 使用 Stream 排序,但是年龄中有个null,所以会报错
            list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed())
                    .collect(Collectors.toList());
        //java8排序 (正确)
        // 按照[年龄]正序,但年龄中有一个 null 值
        list.stream().sorted(Comparator.comparing(Person::getAge,
            Comparator.nullsFirst(Integer::compareTo)).reversed())
            .collect(Collectors.toList());
       // 打印 list 集合
      list.forEach(
             p -> { System.out.println(p); 
       }); 
    }
    } 
    

      

      总结:

            其中 reversed() 表示倒序的意思,如果不使用此方法则是正序。

       JDK 8 之后的版本,就可以使用 Comparator.comparing 实现排序,如果排序字段中可能出现 null 值,要使用 Comparator.nullsXXX 进行排序处理(否则会报错)。

     

     

    MC❤涛
  • 相关阅读:
    Linux常用命令琐记
    JDK 在linux下支持epoll了
    八卦
    JDK 1.6中的并发
    关于Atomic
    关于并发程序设计(二)
    关于并发程序设计 (一)
    Herb Sutter的一些观点
    想到Exchanger N parties的一种用法
    该拒绝MSN Messager了
  • 原文地址:https://www.cnblogs.com/aikutao/p/15722475.html
Copyright © 2020-2023  润新知