测试使用的实体类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Integer id;
private Integer age;
private String name;
}
单个字段的排序
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student = new Student(1,11,"张三");
Student student1 = new Student(2,10,"李四");
Student student2 = new Student(2,9,"王五");
Student student3 = new Student(2,13,"赵六");
studentList.add(student);
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
System.out.println("初始"+studentList.toString());
//升序 第一种方法
studentList.sort(comparing(Student::getAge));
System.out.println("升序 第一种方法"+studentList.toString());
//降序 第一种方法
studentList.sort(comparing(Student::getAge).reversed());
System.out.println("降序 第一种方法"+studentList.toString());
studentList.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println("升序 第二种方法"+studentList.toString());
studentList.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge() - o1.getAge();
}
});
System.out.println("降序 第二种方法"+studentList.toString());
}
描述:排序如果使用Collections.sort(集合);的话则需要在对应的实体类实现Comparable类,然后重写Comparable方法。
此处我第一种方法,我是使用集合的sort方法,然后使用comparing(),再填入需要排序的字段,比重写方法的实现更灵活。使用sort为升序,如果想降序,则使用reversed()方法;.
第二种方法是在sort中实现Comparator的方法,然后在return处get需要进行排序的字段 ,此处需要着重说 public int compare(Student o1, Student o2) {return o2.getAge() - o1.getAge();}这个方法,return处比较运算这块,会返回三种int类型的数值:负整数,零,正整数。
return o2.getAge() - o1.getAge()为负整数时,o2位置排在前面,当为0时,位置不变,当为正整数时,o2位置排在后面
进阶
以上的排序都是按照依次顺序进行排序(如:1、2、3;或者 3、2、1),那想实现年龄根据自定义规则如何实现(如:3、1、2;或者 1、3、2)。
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Student student = new Student(1,11,"张三");
Student student1 = new Student(2,10,"李四");
Student student2 = new Student(4,9,"王五");
Student student3 = new Student(4,13,"赵六");
studentList.add(student);
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
System.out.println("初始"+studentList.toString());
//定义排序使用的顺序集合
List<Integer> ageOrder = Arrays.asList(4, 1, 2);
studentList.sort(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int io1 = ageOrder.indexOf(s1.getId());
int io2 = ageOrder.indexOf(s2.getId());
return io1 - io2;
/* return io2 - io1;*/
}
});
System.out.println("排序后"+studentList.toString());
}
————————————————
原文链接:https://blog.csdn.net/mykingblueblue/article/details/124341002
笔记:
public static void main(String[] args) {
List<BestCoupon> studentList = new ArrayList<>();
BestCoupon student = new BestCoupon(1L, new BigDecimal(3), "张三", 11L, LocalDateTime.now().plusDays(2), 1);
BestCoupon student0 = new BestCoupon(0L, new BigDecimal(3), "张三1", 11L, LocalDateTime.now().plusDays(2), 0);
BestCoupon student1 = new BestCoupon(2L, new BigDecimal(1), "李四", 11L, LocalDateTime.now().plusDays(1), 4);
BestCoupon student2 = new BestCoupon(3L, new BigDecimal(1), "王五", 11L, LocalDateTime.now().plusDays(1), 0);
BestCoupon student3 = new BestCoupon(4L, new BigDecimal(1), "赵六",11L, LocalDateTime.now().plusDays(1), 1);
studentList.add(student);
studentList.add(student0);
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
System.out.println("初始"+studentList.toString());
//定义排序使用的顺序集合
List<Integer> ageOrder = Arrays.asList(1, 4, 0);
studentList.sort(new Comparator<BestCoupon>() {
@Override
public int compare(BestCoupon s1, BestCoupon s2) {
if (s1.getProductCouponPrice().compareTo(s2.getProductCouponPrice()) < 0){
return -1;
}
if (s1.getEndTime().compareTo(s2.getEndTime()) < 0){
return -1;
}
int io1 = ageOrder.indexOf(s1.getType());
int io2 = ageOrder.indexOf(s2.getType());
return io1 - io2;
}
});
studentList.forEach(System.out::println);
}
public static void main(String[] args) {
List<BestCoupon> studentList = new ArrayList<>();
BestCoupon student = new BestCoupon(1L, new BigDecimal(3), "张三", 11L, LocalDateTime.now().plusDays(2), 1);
BestCoupon student0 = new BestCoupon(0L, new BigDecimal(1), "张三1", 11L, LocalDateTime.now().plusDays(2), 0);
BestCoupon student1 = new BestCoupon(2L, new BigDecimal(1), "李四", 11L, LocalDateTime.now().plusDays(1), 4);
BestCoupon student2 = new BestCoupon(3L, new BigDecimal(1), "王五", 11L, LocalDateTime.now().plusDays(3), 0);
BestCoupon student3 = new BestCoupon(4L, new BigDecimal(1), "赵六",11L, null, 4);
studentList.add(student);
studentList.add(student0);
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
System.out.println("初始"+studentList.toString());
//定义排序使用的顺序集合
List<Integer> ageOrder = Arrays.asList(1, 4, 0);
studentList = studentList.stream().sorted(Comparator.comparing(BestCoupon::getEndTime, Comparator.nullsLast(LocalDateTime::compareTo))).collect(Collectors.toList());
studentList.forEach(System.out::println);
System.out.println("------------");
studentList.sort((s1, s2) -> {
if (s1.getProductCouponPrice().compareTo(s2.getProductCouponPrice()) < 0){
return -1;
}
if (s1.getProductCouponPrice().compareTo(s2.getProductCouponPrice()) > 0){
return 1;
}
int io1 = ageOrder.indexOf(s1.getType());
int io2 = ageOrder.indexOf(s2.getType());
return io1 - io2;
//if (s1.getEndTime().compareTo(s2.getEndTime()) > 0){
// return -1;
//}
//return 0;
});
studentList.forEach(System.out::println);
}