重写Compare方法对集合以指定对象的属性进行排序

  • 首先我们创建一个学生类举例子
import java.io.Serializable;

public class Student implements Serializable {
    private static final long serialVersionUID = 8553487662223781924L;
    private Integer id;
    private String name;
    private String birthday;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "Student{" + "id=" + id + ", name='" + name + ", birthday=" + birthday + "}";
    }
}

  • 创建一个以ID排序的
import com.ucarinc.bean.Student;

import java.util.Comparator;

public class SortStudentsById implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        Student stu1 = (Student)o1;
        Student stu2 = (Student)o2;
        // ID从小到大排列
        return stu1.getId().compareTo(stu2.getId());
        // ID从大到小排列
        // return stu2.getId().compareTo(stu1.getId());
    }
}

  • 创建一个以生日排序的类
import com.ucarinc.bean.Student;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;

/**
 * 按照生日对学生进行排序
 */
public class SortStudentsByBirthday implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        Student stu1 = (Student) o1;
        Student stu2 = (Student) o2;
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date birthday1 = sdf.parse(stu1.getBirthday());
            Date birthday2 = sdf.parse(stu2.getBirthday());
            // 按照生日从早到晚排序
            return birthday1.compareTo(birthday2);
            // 按照生日从晚到早排序
            // return birthday2.compareTo(birthday1);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

  • 测试类
public static void main(String[] args) {
    // 得到学生的集合
    List<Student> studentList = getStudentList();
    printStudentList("排序前", studentList);
    System.out.println("------------------------------------");
    // 根据ID进行排序
    Collections.sort(studentList, new SortStudentsById());
    printStudentList("根据ID排序后", studentList);
    System.out.println("------------------------------------");
    // 根据生日进行排序
    Collections.sort(studentList, new SortStudentsByBirthday());
    printStudentList("根据ID排序后,再根据生日排序", studentList);
}

  • 获取学生的集合
private static List<Student> getStudentList() {
    List<Student> students = new ArrayList<>();

    Student stu1 = new Student();
    stu1.setId(3);
    stu1.setBirthday("1973-01-01 00:00:00");
    stu1.setName("刘能");

    Student stu2 = new Student();
    stu2.setId(1);
    stu2.setBirthday("1973-01-01 12:00:00");
    stu2.setName("赵四");

    Student stu3 = new Student();
    stu3.setId(2);
    stu3.setBirthday("1999-09-09 09:09:19");
    stu3.setName("谢广坤");

    students.add(stu1);
    students.add(stu2);
    students.add(stu3);
    return students;
}

  • 打印学生的集合
private static void printStudentList(String type, List<Student> students) {
    for (Student student : students) {
        System.out.println(type + student);
    }
}

  • 排序输出结果
排序前Student{id=3, name='刘能, birthday=1973-01-01 00:00:00}
排序前Student{id=1, name='赵四, birthday=1973-01-01 12:00:00}
排序前Student{id=2, name='谢广坤, birthday=1999-09-09 09:09:19}
------------------------------------
根据ID排序后Student{id=1, name='赵四, birthday=1973-01-01 12:00:00}
根据ID排序后Student{id=2, name='谢广坤, birthday=1999-09-09 09:09:19}
根据ID排序后Student{id=3, name='刘能, birthday=1973-01-01 00:00:00}
------------------------------------
根据ID排序后,再根据生日排序Student{id=3, name='刘能, birthday=1973-01-01 00:00:00}
根据ID排序后,再根据生日排序Student{id=1, name='赵四, birthday=1973-01-01 12:00:00}
根据ID排序后,再根据生日排序Student{id=2, name='谢广坤, birthday=1999-09-09 09:09:19}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值