需求:

定义Employee类

  1. 该类包含:private成员变量name,sal,birthday,其中 birthday 为 MyDate 类时对象;
  2. 为每一个属性定义getter, setter 方法;
  3. 重写toString方法输出name, sal, birthday
  4. MyDate类包含: private成员变量month,day,year;并为每一个属性定义 getter,setter方法;
  5. 创建该类的3个对象,并把这些对象放入ArrayList集合中 (ArrayList 需使用泛型来定义),对集合中的元素进行排序,并遍历输出:

排序方式:调用ArrayList 的sort方法,传入Comparator对象[使用泛型],先按照name排序,如果name相同,则按生日日期的先后排序。

解决:

image.png

Employee

  1. package test;
  2. public class Employee {
  3. private String name;
  4. private double sal;
  5. private MyDate birthday;
  6. public Employee(String name, double sal, MyDate birthday) {
  7. this.name = name;
  8. this.sal = sal;
  9. this.birthday = birthday;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public double getSal() {
  18. return sal;
  19. }
  20. public void setSal(double sal) {
  21. this.sal = sal;
  22. }
  23. public MyDate getBirthday() {
  24. return birthday;
  25. }
  26. public void setBirthday(MyDate birthday) {
  27. this.birthday = birthday;
  28. }
  29. @Override
  30. public String toString() {
  31. return "\nEmployee{" +
  32. "name='" + name + '\'' +
  33. ", sal=" + sal +
  34. ", birthday=" + birthday +
  35. '}';
  36. }
  37. }

MyDate

  1. package test;
  2. public class MyDate implements Comparable<MyDate>{
  3. private int year;
  4. private int month;
  5. private int day;
  6. public MyDate(int year, int month, int day) {
  7. this.year = year;
  8. this.month = month;
  9. this.day = day;
  10. }
  11. public int getYear() {
  12. return year;
  13. }
  14. public void setYear(int year) {
  15. this.year = year;
  16. }
  17. public int getMonth() {
  18. return month;
  19. }
  20. public void setMonth(int month) {
  21. this.month = month;
  22. }
  23. public int getDay() {
  24. return day;
  25. }
  26. public void setDay(int day) {
  27. this.day = day;
  28. }
  29. @Override
  30. public String toString() {
  31. return "MyDate{" +
  32. "year=" + year +
  33. ", month=" + month +
  34. ", day=" + day +
  35. '}';
  36. }
  37. @Override
  38. public int compareTo(MyDate o) { //把对year-month-day比较放在这里
  39. int yearMinus = year - o.getYear();
  40. if(yearMinus != 0) {
  41. return yearMinus;
  42. }
  43. //如果year相同,就比较month
  44. int monthMinus = month - o.getMonth();
  45. if(monthMinus != 0) {
  46. return monthMinus;
  47. }
  48. //如果year 和 month
  49. return day - o.getDay();
  50. }
  51. }

Main

  1. package test;
  2. import java.util.ArrayList;
  3. import java.util.Comparator;
  4. public class Main {
  5. public static void main(String[] args) {
  6. ArrayList<Employee> employees = new ArrayList<>();
  7. employees.add(new Employee("tom", 20000, new MyDate(1980,12,11)));
  8. employees.add(new Employee("jack", 12000, new MyDate(2001,12,12)));
  9. employees.add(new Employee("tom", 50000, new MyDate(1980,12,10)));
  10. System.out.println("employees=" + employees);
  11. employees.sort(new Comparator<Employee>() {
  12. @Override
  13. public int compare(Employee emp1, Employee emp2) {
  14. //先按照name排序,如果name相同,则按生日日期的先后排序。【即:定制排序】
  15. //先对传入的参数进行验证
  16. if(!(emp1 instanceof Employee && emp2 instanceof Employee)) {
  17. System.out.println("类型不正确..");
  18. return 0;
  19. }
  20. //比较name
  21. int i = emp1.getName().compareTo(emp2.getName());
  22. if(i != 0) {
  23. return i;
  24. }
  25. //下面是对birthday的比较,因此,我们最好把这个比较,放在MyDate类完成
  26. //封装后,将来可维护性和复用性,就大大增强.
  27. return emp1.getBirthday().compareTo(emp2.getBirthday());
  28. }
  29. });
  30. System.out.println("==对雇员进行排序==");
  31. System.out.println(employees);
  32. }
  33. }
  34. /**
  35. * 定义Employee类
  36. * 1) 该类包含:private成员变量name,sal,birthday,其中 birthday 为 MyDate 类的对象;
  37. * 2) 为每一个属性定义 getter, setter 方法;
  38. * 3) 重写 toString 方法输出 name, sal, birthday
  39. * 4) MyDate类包含: private成员变量month,day,year;并为每一个属性定义 getter, setter 方法;
  40. * 5) 创建该类的 3 个对象,并把这些对象放入 ArrayList 集合中(ArrayList 需使用泛型来定义),对集合中的元素进行排序,并遍历输出:
  41. *
  42. * 排序方式: 调用ArrayList 的 sort 方法 ,
  43. * 传入 Comparator对象[使用泛型],先按照name排序,如果name相同,则按生日日期的先后排序。【即:定制排序】
  44. */

image.png