今天做了到简单的泛型练习题,自己先敲完实现了,再去看老师的答案,简直羡慕死我,老师的代码看着 “ 太美了 ” 。题目如下:

/*** 定义Employee对象:private成员变量 name、sal、birthday, 其中birthday为MyDate类的对象* 1)为每个属性定义getter和setter方法* 2)重写toString方法输出name、sal、birthday* 3)MyDate类包含:private成员变量:year、month、day,*    并为每个属性定义getter和setter方法* 4)创建该类的3个对象,并把这些对象放入ArrayList集合中(ArrayList需使用泛型来定义)*    对集合中的元素进行排序,并遍历输出**    排序方式:调用ArrayList的sort方法,传入Comparator对象(使用泛型), 先按照name*    排序,如果name相同,则按生日日期的先后排序,即定制排序*/

这是道很简单的练习题,涉及前面所学的ArrayList中sort方法的定制排序,即重写传入的接口的compare方法。下面是我的实现方法:

日期类MyDate:

class MyDate {private int year;private int month;private int day;public MyDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public static int compareDate(MyDate date1, MyDate date2) {if (date1.getYear() == date2.getYear()) {if (date1.getMonth() == date2.getMonth()) {if (date1.getDay() > date2.getDay()) {return 1;} else {return -1;}} else if (date1.getMonth() > date2.getMonth()) {return 1;} else {return -1;}} else if (date1.getYear() > date2.getYear()) {return 1;} else {return -1;}}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}
}

员工类Employee:

class Employee {private String name;private double sal;private MyDate birthday;@SuppressWarnings({"all"})public Employee(String name, double sal, MyDate birthday) {this.name = name;this.sal = sal;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSal() {return sal;}public void setSal(double sal) {this.sal = sal;}public MyDate getBirthday() {return birthday;}public void setBirthday(MyDate birthday) {this.birthday = birthday;}@Overridepublic String toString() {return name + " " + sal + " " + birthday.getYear() + "-"+ birthday.getMonth() + "-" + birthday.getDay();}
}

测试类Demo:

public class Demo {@SuppressWarnings({"all"})public static void main(String[] args) {ArrayList<Employee> emlist = new ArrayList<>();Employee em1 = new Employee("JJLin", 34000, new MyDate(1989, 3, 23));Employee em2 = new Employee("GEA", 24005, new MyDate(1995, 4, 12));Employee em3 = new Employee("Jack", 45098, new MyDate(1994, 12, 10));emlist.add(em1);emlist.add(em2);emlist.add(em3);System.out.println(emlist);emlist.sort(new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {/*先按照name排序,如果name相同,则按生日日期的先后排序,即定制排序*/if (o1.getName().compareTo(o2.getName()) > 0) {return 1;} else if (o1.getName().compareTo(o2.getName()) < 0) {return -1;} else {return MyDate.compareDate(o1.getBirthday(), o2.getBirthday());}}});System.out.println(emlist);}
}

我将日期的比较封装成一个MyDate类中的方法,这样看也没错,功能也确实能实现,但缺点很明显:代码冗余度较高、可读性不够。下面是老师对于日期比较的代码:

class MyDate implements Comparable<MyDate>{//老师实现了Comparable接口private int year;private int month;private int day;//该类除MyDate实现了Comparable接口、原先的
//compareDate方法替换成compareTo, 其余代码不变@Overridepublic int compareTo(MyDate date) {int yearMinus = this.year - date.year;if (yearMinus != 0){return yearMinus;}int monthMinus = this.year - date.year;if (monthMinus != 0) {return monthMinus;}int dayMinus = this.day - date.day;if (dayMinus != 0) {return dayMinus;}return 0;}
}

main方法中,只看定制排序部分,其余不变:

emlist.sort(new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {/*先按照name排序,如果name相同,则按生日日期的先后排序,即定制排序*/int nameres = o1.getName().compareTo(o2.getName());if (nameres != 0){return nameres;}return o1.getBirthday().compareTo(o2.getBirthday());}});

自己对日期判断用了 if - else 分支结构,但没用好,反而让代码量增加,阅读体验感不佳。老师的代码值得学习的地方:


1. 利用好比较值的差值,作返回值,减少代码量,逻辑更清晰;

2. 让日期类实现Comparable接口,使后续有日期比较,都可用重写的该方法;


在这记录下,方便日后复习

学习体会:简单的代码也要写得美相关推荐

  1. 《神经网络和深度学习》系列文章五:用简单的网络结构解决手写数字识别

    出处: Michael Nielsen的<Neural Network and Deep Learning>,点击末尾"阅读原文"即可查看英文原文. 本节译者:哈工大S ...

  2. 设计模式学习之简单聊聊如何写出优秀的代码

    前言: 到底什么样的代码是优秀的代码?这个恐怕是仁者见仁.智者见智的问题.一个程序员随着能力的提升和视野的开拓不同的阶段看待这个问题会有不一样的答案.不过常见的一些评判的标准,像可维护性,可扩展性.可 ...

  3. 用VB6写的一个简单俄罗斯方块代码

    网络上有很多俄罗斯方块代码.它们大都为了视觉效果,程序比较复杂,不利于学习游戏编程.所以我写了个简单俄罗斯方块代码,尽量用VB本身的功能,没有复杂的DirectX. 下载(注意修改下载后的扩展名) m ...

  4. python简单爬虫代码-python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息...

    原标题:python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息 最近经常有人问我,明明看着教程写个爬虫很简单,但是自己上手的时候就麻爪了...那么今天就给刚开始学习爬虫的同学,分享一下怎么一步 ...

  5. 深度学习研究生如何快速提升代码能力,写出高效的代码?

    深度学习代码与前端代码区别 深度学习的代码能力与开发后台或者前端的工程代码能力不是一个概念. 写前端代码:脑海中是整个工程的架构,写代码则是把这些架构用 code 具体化. 写深度学习代码:脑海中浮现 ...

  6. 吴恩达《深度学习专项》笔记+代码实战(二):简单的神经网络——逻辑回归

    这堂课要学习的是逻辑回归--一种求解二分类任务的算法.同时,这堂课会补充实现逻辑回归必备的数学知识.编程知识.学完这堂课后,同学们应该能够用Python实现一个简单的小猫辨别器. 前排提示:本文篇幅较 ...

  7. python游戏最简单代码-用python写游戏脚本原来这么简单

    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...

  8. 原生js写三级联动 java_原生js三级联动的简单实现代码

    本文实例为大家分享了js查询天气应用,供大家参考,具体内容如下 实现功能:打开网页时显示用户所在城市的天气状况,在输入框输入城市可查询其它城市. 实现过程:先调用百度地图的API来获取用户所在的城市, ...

  9. php定义一个计算器函数,php学习之简单计算器实现代码

    PHP实现简单计算器 //单路分支 if(isset($_GET["sub"])) { $num1=true;//数字1是否为空标记 $num2=true;//数字2是否为空标记 ...

最新文章

  1. c 各种编译器(gcc clang)
  2. 创业互联网公司如何搭建自己的技术架构
  3. python画皇冠_用Python画小女孩放风筝的示例
  4. 2019 ACM/ICPC 南昌站 G,拉格朗日插值
  5. The specified JRE installation does not exist异常的原因和解决办法
  6. loadGrid layui
  7. SparkSQL架构
  8. Julia: 由0.3 升级到0.4 版本的变化
  9. matlab拟合不显示直线,新人求助一下MATLAB直线拟合问题
  10. 权重计算方法三:变异系数法(Coefficient of Variation)
  11. openwrt 进入failsafe模式
  12. Linux常用命令之scp
  13. lingo标准模型与编程(附习题、代码)
  14. uniapp适配pc_uni-app支持PC版!
  15. Nmap学习4 - 主机发现 实验一
  16. 在windows 10中新建文本文档,只有txt文件双击打不开,但右键点编辑可以打开。
  17. 过期域名查询 php,域名啦过期删除域名检索系统 v1.0
  18. IPFS计算机存储器,IPFS节点储存
  19. 泰国海外漫游卡业务介绍
  20. 亲亲小嘴后,不应该就是摸摸小胸么

热门文章

  1. python解析照片拍摄时间和地点信息
  2. python根据出生年份算年龄_python小题 按天算年龄
  3. 2015年12月21日阴
  4. 学生学籍管理系统源码:Springboot+VUE
  5. 浅谈Azure virtual machine scale set
  6. 简单XXE漏洞理解以及在实战中演练【网络安全】
  7. 程序猿生存指南-29 朝花夕拾
  8. PLS中的权值和载荷
  9. 单片机中断机制对日常生活的启示_单片机原理及接口技术课后习题答答
  10. 拉链表应用——财务总账