Java常规排序
方式一:
实现
Comparable<Student>
接口,重写compareTo
方法
/**
* @Author yp
* @Date 2021-05-19
* @Description
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Comparable<Student>{
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<User> getUserListSort(){
// 开发中,数据一般都来源于数据库,这里不做具体操作了,假设下面的userList是有数据的,且是没有排序的
List<User> userList = new ArrayList<>();
// 开始排序
Collections.sort(userList);
// 这个时候返回的userList已经排过序了
return userList;
}
}
方式二
实现
implements Comparator<Cell>
接口,重写compare
方法
// 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cell {
private Integer x;
private Integer y;
}
// 调用
public class CellTest implements Comparator<Cell> {
@Override
public int compare(Cell o1, Cell o2) {
return o1.getY() - o2.getY();
}
public static void main(String[] args) {
List<Cell> 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<Cell> 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<Cell>() { //此处创建了一个匿名内部类
@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<UserInfo> userInfoList = new ArrayList<>();
userInfoList.add(user2);
userInfoList.add(user1);
userInfoList.add(user3);
userInfoList.add(user4);
userInfoList.add(user5);
userInfoList.add(user6);
//使用lambda表达式对age大小正序排序
List<UserInfo> collect = userInfoList.stream().sorted(
Comparator.comparing(UserInfo::getAge)
).collect(Collectors.toList());
for (UserInfo info : collect) {
System.out.println(info);
}
System.out.println("********************");
// 按照年龄倒序
List<UserInfo> collect1 = userInfoList.stream().sorted(
Comparator.comparing(UserInfo::getAge).reversed()
).collect(Collectors.toList());
for (UserInfo info : collect1) {
System.out.println(info);
}
System.out.println("********************");
// 按照某个字段正序排序
List<UserInfo> collect2 = userInfoList.stream().sorted(
Comparator.comparing(UserInfo::getName)
).collect(Collectors.toList());
for (UserInfo info : collect2) {
System.out.println(info);
}
//按照某个字段倒序排序
}
}