Java排序

108 阅读4分钟

1、普通类型升序

如下代码,列举了 String、Integer 类型集合升序,其他类型:Long、Double、Float、Byte 类似。

//正序
@Test
public void test1() {
    //String类型升序
    List<String> stringList = Arrays.asList("5", "2", "4", "3", "1");
    //排序后
    List<String> stringListSorted = stringList.stream().
            sorted(String::compareTo).
            collect(Collectors.toList());
    stringListSorted.forEach(System.out::println);

    System.out.println("----------------------");

    //Integer类型升序
    List<Integer> intList = Arrays.asList(5, 2, 4, 3, 1);
    //排序后
    List<Integer> intListSorted = intList.stream().
            sorted(Integer::compareTo).
            collect(Collectors.toList());
    intListSorted.forEach(System.out::println);
}

输出:

1
2
3
4
5
----------------------
1
2
3
4
5

推荐阅读: 尚硅谷 Java 学科全套教程(总 207.77GB)

2、普通类型降序

如下代码,列举了 String、Integer 类型集合降序,其他类型:Long、Double、Float、Byte 类似。

//降序
@Test
public void test2() {
    //String类型降序
    List<String> stringList = Arrays.asList("5", "2", "4", "3", "1");
    //排序后
    List<String> stringListSorted = stringList.stream().
        sorted(String::compareTo).
        sorted(Comparator.reverseOrder()).
        collect(Collectors.toList());
    stringListSorted.forEach(System.out::println);

    System.out.println("----------------------");

    //Integer类型降序
    List<Integer> intList = Arrays.asList(5, 2, 4, 3, 1);
    //排序后
    List<Integer> intListSorted = intList.stream().
        sorted(Integer::compareTo).
        sorted(Comparator.reverseOrder()).
        collect(Collectors.toList());
    intListSorted.forEach(System.out::println);
}

输出:

5
4
3
2
1
----------------------
5
4
3
2
1

推荐阅读: 2021 最新版 Java 微服务学习线路图 + 视频

3、Java 对象单字段升序

按照用户年龄升序排序,先来个用户类:

public static class User{
    private String name;
    private Integer age;

    public User(String name, Integer age) {
        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 "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

按照 age 升序,代码如下:

@Test
public void test3(){
    List<User> userList = Arrays.asList(
        new User("1001",30),
        new User("1002",20),
        new User("1003",40),
        new User("1004",20));
    List<User> userListSorted = userList.stream().
        sorted(Comparator.comparing(User::getAge)).
        collect(Collectors.toList());
    userListSorted.stream().forEach(System.out::println);
}

运行输出:

User{name='1002', age=20}
User{name='1004', age=20}
User{name='1001', age=30}
User{name='1003', age=40}

推荐阅读: 阿里技术大佬整理的《Spring 学习笔记.pdf》

5、Java 对象单字段降序

5.1 不考虑age=null的写法

按照 age 降序,代码如下:

@Test
public void test4(){
    List<User> userList = Arrays.asList(
            new User("1001",30),
            new User("1002",20),
            new User("1003",40),
            new User("1004",20));
    List<User> userListSorted = userList.stream().
      			//age 降序,如果age相同,再根据id升序
            sorted(Comparator.comparing(User::getAge).reversed()
                   //age相同,根据id升序
                  .thenComparing(User::getId)
            			).
            collect(Collectors.toList());
    userListSorted.stream().forEach(System.out::println);
}

运行输出:

User{name='1003', age=40}
User{name='1001', age=30}
User{name='1002', age=20}
User{name='1004', age=20}

5.2 考虑age=null的写法

public static void main(String[] args) {
        // age 升序
        List<User> userList = Arrays.asList(
                new User("1001",30),
                new User("1002",20),
                new User("1003",40),
                new User("1004",null)
        );
        List<User> userListSorted = userList.stream()
                .sorted(Comparator.comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)))
                .collect(Collectors.toList());
        userListSorted.stream().forEach(System.out::println);
  //null放最后,Comparator.nullsLast(Integer::compareTo)
  //null放最前,Comparator.nullsFirst(Integer::compareTo)
}

结果:

User{name='1002', age=20}
User{name='1001', age=30}
User{name='1003', age=40}
User{name='1004', age=null}

推荐阅读: 阿里大佬的《MySQL 学习笔记高清.pdf》

6、Java 对象多字段排序

age 升序,name 降序:

@Test
public void test5() {
    List<User> userList = Arrays.asList(
            new User("1001", 30),
            new User("1002", 20),
            new User("1003", 40),
            new User("1004", 20));
    List<User> userListSorted = userList.stream().
            sorted(Comparator.comparing(User::getAge).
                    thenComparing(Comparator.comparing(User::getName).reversed())).
            collect(Collectors.toList());
    userListSorted.stream().forEach(System.out::println);
}

运行输出:

User{name='1004', age=20}
User{name='1002', age=20}
User{name='1001', age=30}
User{name='1003', age=40}

7、完整代码

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class SortTest {
    //正序
    @Test
    public void test1() {
        //String类型升序
        List<String> stringList = Arrays.asList("5", "2", "4", "3", "1");
        //排序后
        List<String> stringListSorted = stringList.stream().
                sorted(String::compareTo).
                collect(Collectors.toList());
        stringListSorted.forEach(System.out::println);

        System.out.println("----------------------");

        //Integer类型升序
        List<Integer> intList = Arrays.asList(5, 2, 4, 3, 1);
        //排序后
        List<Integer> intListSorted = intList.stream().
                sorted(Integer::compareTo).
                collect(Collectors.toList());
        intListSorted.forEach(System.out::println);
    }

    //降序
    @Test
    public void test2() {
        //String类型降序
        List<String> stringList = Arrays.asList("5", "2", "4", "3", "1");
        //排序后
        List<String> stringListSorted = stringList.stream().
                sorted(String::compareTo).
                sorted(Comparator.reverseOrder()).
                collect(Collectors.toList());
        stringListSorted.forEach(System.out::println);

        System.out.println("----------------------");

        //Integer类型降序
        List<Integer> intList = Arrays.asList(5, 2, 4, 3, 1);
        //排序后
        List<Integer> intListSorted = intList.stream().
                sorted(Integer::compareTo).
                sorted(Comparator.reverseOrder()).
                collect(Collectors.toList());
        intListSorted.forEach(System.out::println);
    }

    //age 升序
    @Test
    public void test3() {
        List<User> userList = Arrays.asList(
                new User("1001", 30),
                new User("1002", 20),
                new User("1003", 40),
                new User("1004", 20));
        List<User> userListSorted = userList.stream().
                sorted(Comparator.comparing(User::getAge)).
                collect(Collectors.toList());
        userListSorted.stream().forEach(System.out::println);
    }

    //age 降序
    @Test
    public void test4() {
        List<User> userList = Arrays.asList(
                new User("1001", 30),
                new User("1002", 20),
                new User("1003", 40),
                new User("1004", 20));
        List<User> userListSorted = userList.stream().
                sorted(Comparator.comparing(User::getAge).reversed()).
                collect(Collectors.toList());
        userListSorted.stream().forEach(System.out::println);
    }

    //age升序 name降序
    @Test
    public void test5() {
        List<User> userList = Arrays.asList(
                new User("1001", 30),
                new User("1002", 20),
                new User("1003", 40),
                new User("1004", 20));
        List<User> userListSorted = userList.stream().
                sorted(Comparator.comparing(User::getAge).
                        thenComparing(Comparator.comparing(User::getName).reversed())).
                collect(Collectors.toList());
        userListSorted.stream().forEach(System.out::println);
    }


    public static class User {
        private String name;
        private Integer age;

        public User(String name, Integer age) {
            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 "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

8、排序考虑NULL的情况

// nullsLast 可以换位nullsFirst 
List extendTemp = extendDtos.stream().sorted(Comparator.comparing(o -> o.getText(), Comparator.nullsLast(String::compareTo))).collect(toList());