Java常规排序(三种) 和 Lmabda排序

Java常规排序

方式一:

实现Comparable接口,重写compareTo方法

/**
 * @Author yp
 * @Date 2021-05-19
 * @Description
 **/


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Comparable{

    private Integer id;

    private String name;

    private String sex;

    private Integer age;

    private String address;

    @Override
    public int compareTo(Student stu) {

        // 在这里可以根据业务具体需求做调整,目前是最基础的
        // 比如:if判断如果id为空,就age排序,如果age为空,就id排序,双层if嵌套一下即可,看需求
        if (this.age > stu.age){
            return 1;// 正序
        }
        return -1;// 倒序
    }


    /**
     * 这里为了省事不在新建类了,意义是一样的
     * 假设这个方法要返回一个排好序的用户集合
     */
    public List getUserListSort(){

        // 开发中,数据一般都来源于数据库,这里不做具体操作了,假设下面的userList是有数据的,且是没有排序的
        List userList = new ArrayList<>();
        // 开始排序
        Collections.sort(userList);

        // 这个时候返回的userList已经排过序了
        return userList;

    }

}



方式二

实现 implements Comparator接口,重写compare方法

// 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cell {

    private Integer x;

    private Integer y;
}

// 调用
public class CellTest implements Comparator {
    @Override
    public int compare(Cell o1, Cell o2) {
        return o1.getY() - o2.getY();
    }

    public static void main(String[] args) {
        List cells = new ArrayList<>();
        cells.add(new Cell(2,3));
        cells.add(new Cell(5,1));
        cells.add(new Cell(3,2));
        System.out.println(cells);      // out:[Cell(x=2, y=3), Cell(x=5, y=1), Cell(x=3, y=2)]
        CellTest cellTest = new CellTest();
        Collections.sort(cells, cellTest);
        System.out.println(cells);      // out:[Cell(x=5, y=1), Cell(x=3, y=2), Cell(x=2, y=3)]
    }
}



方式三

实现 匿名内部类方式

// 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cell {

    private Integer x;

    private Integer y;
}

// 调用
public class CellTest {

    public static void main(String[] args) {
        List cells = new ArrayList<>();
        cells.add(new Cell(2, 3));
        cells.add(new Cell(5, 1));
        cells.add(new Cell(3, 2));
        System.out.println(cells);              //out:[Cell [x=2, y=3], Cell [x=5, y=1], Cell [x=3, y=2]]
        Collections.sort(cells, new Comparator() {  //此处创建了一个匿名内部类
            @Override
            public int compare(Cell o1, Cell o2) {
                return o1.getY() - o2.getY();
            }
        });
        System.out.println(cells);              //out:[Cell(x=5, y=1), Cell(x=3, y=2), Cell(x=2, y=3)]
    }
}



JDK 8 新特性 Lamabda表达式排序

/**
 * @Author yp
 * @Date 2021-05-19
 * @Description
 **/

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {

    private int id;
    private String age;
    private String name;
}


out:****************************************  测试

@Test
    void contextLoads() {
        UserInfo userInfo = new UserInfo();
        UserInfo user1 = new UserInfo(1, "20", "赵");
        UserInfo user2 = new UserInfo(2, "25", "钱");
        UserInfo user3 = new UserInfo(3, "23", "孙");
        UserInfo user4 = new UserInfo(7, "16", "李");
        UserInfo user5 = new UserInfo(6, "19", "周");
        UserInfo user6 = new UserInfo(5, "12", "吴");
        List userInfoList = new ArrayList<>();
        userInfoList.add(user2);
        userInfoList.add(user1);
        userInfoList.add(user3);
        userInfoList.add(user4);
        userInfoList.add(user5);
        userInfoList.add(user6);
        //使用lambda表达式对age大小正序排序
        List collect = userInfoList.stream().sorted(
                Comparator.comparing(UserInfo::getAge)
        ).collect(Collectors.toList());
        for (UserInfo info : collect) {
            System.out.println(info);
        }
        System.out.println("********************");

        // 按照年龄倒序
        List collect1 = userInfoList.stream().sorted(
                Comparator.comparing(UserInfo::getAge).reversed()
        ).collect(Collectors.toList());
        for (UserInfo info : collect1) {
            System.out.println(info);
        }

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

        // 按照某个字段正序排序
        List collect2 = userInfoList.stream().sorted(
                Comparator.comparing(UserInfo::getName)
        ).collect(Collectors.toList());
        for (UserInfo info : collect2) {
            System.out.println(info);
        }

        //按照某个字段倒序排序

    }

}

你可能感兴趣的:(Java常规排序(三种) 和 Lmabda排序)