JAVA集合对指定字段进行排序操作

测试使用的实体类

@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);
    }
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值