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

/*** 定义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. 独家 | 10个数据科学家常犯的编程错误(附解决方案)
  2. python内置函数源码_python如何查看内置函数源码
  3. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  4. 【转载】使用Imaging组件加载GIF动画
  5. 机器学习中各类算法的优缺点比较
  6. python模块化编程_什么是模块,Python模块化编程(入门必读)
  7. 43个实例xHTML+CSS(DIV+CSS)网页及导航布局教程
  8. hive 的 left semi join 讲解与left jion的区别
  9. hadoop+hive+hbase+spark补充内容
  10. linux下svn的用法
  11. kaldi GMM模型解码指令 gmm-latgen-faster详解
  12. 1-Java基础语法-Java初识
  13. html不建议翻译,[译] 可用但最不常见的 HTML5 标签
  14. Maven压缩插件YUI Compressor使用介绍
  15. WebService入门(二)wsimport的使用
  16. 批处理创建桌面快捷方式
  17. 关于树莓派无法解析域名的错误
  18. 用Python蹭别人家图片接口,做一个【免费图床】吧
  19. 在Windows Server 2022系统上安装 Brother MFC-7450打印机驱动
  20. vue3项目中如何使用iconfont图标?体积太大?看这篇文章就够了!

热门文章

  1. Alluxio基于冷热数据分离的元数据管理策略
  2. 华为无线二层网络配置案例(直接转发)
  3. html快闪软件制作,快闪视频制作方法
  4. Unity学习笔记(四)预制件Prefabs
  5. CSIG-DIAR 2020学术年会系列报道-学习笔记
  6. t3服务器系统要求,用友t3服务器配置需求
  7. Camtasia音画同步剪辑教程
  8. 如何发布一个外网可以访问的网站
  9. 谷粒商城-01-p1-p19
  10. win32asm seh构建try catch