第一次个人编程作业

GitHub链接

个人仓库

给出PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 30
· Estimate · 估计这个任务需要多少时间 1830 2150
Development 开发 180 300
· Analysis · 需求分析 (包括学习新技术) 240 300
· Design Spec · 生成设计文档 60 60
· Design Review · 设计复审 60 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 20
· Design · 具体设计 60 90
· Coding · 具体编码 720 780
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 180 300
Reporting 报告 60 60
· Test Repor · 测试报告 60 60
· Size Measurement · 计算工作量 60 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 60
· 合计 1830 2150

解题思路

  • 解题思路描述

因为题目要求恢复文件中的数据,而文件由于损坏,手机号码混在了地址数据中,所以我们要做的是:①将手机号码提取分割,这块主要的实现方法是用正则表达式将以一开头的11位数字分割出来,因为题目有要求手机号码一定不会和地址中的数字相邻,所以不用担心出现手机号码出现超出11位的情况;②分割出手机号码之后,再来分割姓名,以“,”为分隔符来进行分割;③剩下的就剩地址数据了,解析数据是整道题目的重难点,因为给出的地址并不统一,有的省份缺失,有的省份并没有给出省这个字,也有一些缺失市级啊什么的情况,因此不能通过查找某一个字来正确的解析出地址,比较好的方法是匹配一个地图,然而我并不懂得怎样去实现;④输出的文件格式要求有“""”将姓名,手机等信息框进去,而在代码的实现时,输出又不能两个双引号放在一起,所以就要找其他的方法。⑤整体思路还算清晰,但是具体的实现真的很难。
找资料:最开始用C++写的时候,参考的是C++程序设计(第三版)中第13章输入输出流里对数据文件的操作与文件流部分,之后改用java,是在慕课里找了一些基本的视频观看,然后针对一些特定的函数和术语在百度上进行搜索和参考。

  • 设计实现过程

最初我选择的编程语言是C++,因为java和python我都不熟悉,但是用C++做了一点之后发现不太好做,然后听说java的正则表达式比较好实现,所以改用java,但因为才开始学,很多java的函数都不熟悉,也不会用,所以需要查找很多的资料,还要能理解资料上讲述的内容,这就是一个非常耗时的工作,再加上我转用java之后,距离作业提交的截止时间已经很近了,这次作业又需要安装许多的软件,使用很多以前没有使用过的工具,所有的一切都不熟悉,所以费神费力或许还不讨好,弄得人手忙脚乱的,最后也没能完成一个完整的代码。我本来想的会至少有三个类来编写这次程序,一个类从文件里读取数据并且输出到另一个文件夹,一个类提取姓名和电话,一个类解析地址,但这些对我来说太难了,到最后也没能够实现。

  • 计算模块接口部分的性能改进

因为代码没有完成,所以也说不上什么性能改进,也没有什么改进的思路,只不过在最初的时候文件的输入输出的路径有点问题,不过后来改了一下路径就好了。

  • 计算模块部分单元测试展示
    • 关键代码
      • 提取手机号码的正则表达式

(?😦(13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\d{8})

  - 解析地址的关键代码

String regex="(?[省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[市]+自治州|.?地区|.?行政单位|.+盟|市辖区|.?市|.?县)(?[县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[区]+区|.+镇)?(?.*)";

  • 部分代码

public static List<Map<String, String>> addressResolution(String address) {
String regex = "(?[省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[市]+自治州|.?地区|.?行政单位|.+盟|市辖区|.?市|.?县)(?[县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[区]+区|.+镇)?(?.*)";
Matcher m = Pattern.compile(regex).matcher(address);
String province = null, city = null, county = null, town = null, village = null;
List<Map<String, String>> table = new ArrayList<Map<String, String>>();
Map<String, String> row = null;
while (m.find()) {
row = new LinkedHashMap<String, String>();
province = m.group("province");
row.put("province", province == null ? "" : province.trim());
city = m.group("city");
row.put("city", city == null ? "" : city.trim());
county = m.group("county");
row.put("county", county == null ? "" : county.trim());
town = m.group("town");
row.put("town", town == null ? "" : town.trim());
village = m.group("village");
row.put("village", village == null ? "" : village.trim());
table.add(row);
}
return table;
}

  • 计算模块部分异常处理说明

在输入文件这一模块这里,一开始没有设置好文件路径,导致读取失败,最后处理了一下相关路径就成功了。

  • 结合在构建之法中学习到的相关内容与个人项目的实践经历,撰写解决项目的心路历程与收获。

心路历程:刚开始想的太简单,以为很容易,但从安装软件开始,就遇到各种各样的问题,很多软件都是全英文的环境,所以理解就很费力。之后又在用代码具体实现的过程中接连遇挫,心真的好累。因为我自己代码没有打完,所以关于测试和性能分析方面就没有发言权。
收获:对java编程语言进行了初步的学习,熟悉了vs 和eclipse 的编程环境,学会了怎样把表格用Markdown打开。

  • 给自己的话
    • 作业一定要尽早开始,给自己留充足的时间
    • 学好一门编程语言很重要
    • 要学会熟练运用工具
    • 心好累
posted @ 2019-09-17 22:58  橘止大方  阅读(180)  评论(6)    收藏  举报