年月日排序)"/>
过关展将之——birthday排序(年月日排序)
传统的方法排序,需要嵌套多重循环,代码可读性不高,代码冗余
就像下面这样:
public int compare(Employee o1, Employee o2) {if (!(o1.getName() != null && o2.getName() != null)) {throw new RuntimeException("员工姓名不能为空!");}else{if (o1.getName().equals(o2.getName())) {if (o1.getBirthday().getYear() == o2.getBirthday().getYear()) {if (o1.getBirthday().getMonth() == o2.getBirthday().getMonth()) {if (o1.getBirthday().getDay() == o2.getBirthday().getDay()) {return 0;} else if (o1.getBirthday().getDay() > o2.getBirthday().getDay()) {return 1;} else {return -1;}} else if (o1.getBirthday().getMonth() > o2.getBirthday().getMonth()) {return 1;} else {return -1;}} else if (o1.getBirthday().getYear() > o2.getBirthday().getYear()) {return 1;} else {return -1;}} else {return o1.getName()pareTo(o2.getName());}}}
在看这样一段代码,是不是进一步清晰了一点呢?其实下面代码依旧没摆脱使用if语句嵌套的命运,代码还是不够简洁,句式杂糅,可读性差:
public int compare(EmployeeImp o1, EmployeeImp o2) {if (!(o1 instanceof EmployeeImp && o2 instanceof EmployeeImp)) {System.out.println("类型不匹配");return 0;}//比较nameint i = o1.getName()pareTo(o2.getName());if (i==0) {//如果名字相同,就继续比较int yearMinus =o1.getBirthday().getYear() - o2.getBirthday().getYear();if(yearMinus==0){//如果两个年份相同,继续比较月份int monthMinus = o1.getBirthday().getMonth()- o2.getBirthday().getMonth();if(monthMinus==0){//如果两个月份相同,继续比较日int dayMinus = o1.getBirthday().getDay()- o2.getBirthday().getDay();if(dayMinus==0){return 0;}else{return dayMinus;}}else{return monthMinus;}}else{return yearMinus;}} else{//如果名字不相同,就返回,出结果return i;}}
在看下面一段带码:我们使用过关斩将法,将杂糅的if嵌套格式分解出来,变成一步一步执行的if语句:看起来是不是清晰多了?
public int compare(EmployeeImp o1, EmployeeImp o2) {if (!(o1 instanceof EmployeeImp && o2 instanceof EmployeeImp)) {System.out.println("类型不匹配");return 0;}//比较nameint i = o1.getName()pareTo(o2.getName());if (i != 0) {//如果名字不相同,直接返回return i;}//以下是对birthday的比较,因此,我们最好把这个比较,放在MyDateint yearMinus = o1.getBirthday().getYear() - o2.getBirthday().getYear();if (yearMinus != 0) {//如果两个年份不相同,直接返回return yearMinus;}int monthMinus = o1.getBirthday().getMonth() - o2.getBirthday().getMonth();if (monthMinus != 0) {//如果两个月份不相同,直接返回return monthMinus;}//如果year、month都相同return o1.getBirthday().getDay() - o2.getBirthday().getDay();}
传送门,另一个过关斩将法的小案例:过关斩将法:验证输入的用户信息:-CSDN博客
希望可以帮助你,提升代码能力!
更多推荐
过关展将之——birthday排序(年月日排序)
发布评论