第一次个人编程作业
1.My Github
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 180 | 240 |
· Development | · 开发 | 200 | 180 |
· Analysis | · 需求分析 (包括学习新技术) | 200 | 300 |
· Design Spec | · 生成设计文档 | 160 | 200 |
· Design Review | · 设计复审 | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | ||
· Design | · 具体设计 | ||
· Coding | · 具体编码 | ||
· Code Review | · 代码复审 | ||
· Test | · 测试(自我测试,修改代码,提交修改) | ||
· Reporting | · 报告 | 40 | 60 |
· Test Repor | · 测试报告 | ||
· Size Measurement | · 计算工作量 | 12 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 862 | 1085 |
3.设计
- 难度分级;
- 提取Name And Tel得到预处理地址;
- 处理剩下的预处理地址
- 由于没有搜到准确的全国乡镇街道级数据集,故各级地址一律调用高德API进行提取
- 鉴于前两级难度(可为空情况)的题目,以提取的地址数据与预处理地址进行比对
4.实现
- nameProcessing()方法:提取Name And Tel;
- addressGetting()方法:通过高德API地理编码与与逆地理编码进行提取;
- simpleProcessing()方法:通过数据对比解决前两级难度题目;
- 调用fastjson.jar进行json数据格式输出;
5.性能分析
- 使用Eclipse官方插件MAT(Memory Analyzer):该插件主要用于内存分析–分析heap dump是否存在内存泄漏
- MAT工具分析了heap dump后在界面上非常直观的展示了一个饼图,该图深色区域被怀疑有内存泄漏,可以发现整个heap才4.5M内存,深色区域仅占了26.7%。接下来明确指出system class loader加载的”java.lang.Thread”实例有内存聚集,并建议用关键字”java.lang.Thread”进行检查。
对于这个问题我看了很多文章,我发现java新手所作的程序很容易引起”java.lang.Thread”实例有内存聚集,具体的原因很可能是有些类实现该Object.finalize()方法。重写此方法的对象需要由后台线程调用终结器调用,并且在这种情况发生之前无法清理它们。如果这些任务很短,而且不会丢弃其中的许多,那么这一切都会很好。但是,如果要创建大量这些对象和/或它们的终结器需要很长时间,则需要完成对象的队列。主要原因还是学习经验不足,代码设计时未进行完善的内存分析,而在调用一些javaLib时不清楚该方法需要人为关闭,导致调用该方法已经结束,而该方法随着main一直运行并占用一定内存。果然三脚猫功夫的问题还是很多!基础应该够扎实才能开始深入。说白了就是太菜了还不够强,希望大家多多提点!
6.单元测试
-
测试样例:
<font color=#E9967A size=3face=”微软雅黑”>1!苗朽蕾,13884441418湖北省孝感市云梦县方庙村村委会.
1!晏孔,重庆巫山13097181946县大昌镇洋溪村便民超市.
1!荆麻,13282875332天津市北淮淀镇乐善庄村乐善庄小学.
1!诸葛宁盛,河南省15613629652焦作市山阳区定和街道塔南路287号新兴日化.
1!冯昔唉,安徽省合肥市庐江县郭河镇G3京台高18835354291速合肥市庐江县广寒桥街道.
1!百里屏闷,广西壮族自治区桂林市灵川县潭13315249688下镇004乡道灵川县潭下镇大义村民委员会.
1!徐扼负,天津市河北区月牙河街道大江里58号楼13289199578.
2!凤干挨,辽15559696768宁抚顺市新抚区新抚街道福民路41号双桥社区北区.
2!詹鸵,天津市南开区万兴街道白堤路164号风荷15224524195东园5号楼.
3!蔺脚贺,湖南省娄底市冷水江市石槽村三尖镇15581828223人民政府. -
测试代码:
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class MainTest {
File file2 = new File("input.txt");
Scanner input = new Scanner(file2);
@Before
public void setUp() throws Exception {
}
@Test
public void testNameProcessing() {
while (input.hasNext()) {
String string = input.next();
Main.nameProcessing(input);
}
fail("Not yet implemented");
}
@Test
public void testAddressGetting() throws Exception {
while (input.hasNext()) {
String string = input.next();
String address = Main.nameProcessing(input);
address = Main.locationProcessing(address);
Main.addressGetting(address);
}
fail("Not yet implemented");
}
@Test
public void testLocationProcessing() throws Exception {
while (input.hasNext()) {
String string = input.next();
String address = Main.nameProcessing(input);
address = Main.locationProcessing(address);
}
}
}
- 测试结果:
<font color=#E9967A size=3face=”微软雅黑”>{
“地址”:[
“湖北省”,
“孝感市”,
“云梦县”,
“”,
“方庙村村委会”
],
“姓名”:”苗朽蕾”,
“手机”:”13884441418″
},{
“地址”:[
“重庆”,
“重庆市”,
“巫山县”,
“大昌镇”,
“洋溪村便民超市”
],
“姓名”:”晏孔”,
“手机”:”13097181946″
},{
“地址”:[
“天津”,
“天津市”,
“”,
“北淮淀镇”,
“乐善庄村乐善庄小学”
],
“姓名”:”荆麻”,
“手机”:”13282875332″
},{
“地址”:[
“河南省”,
“焦作市”,
“山阳区”,
“定和街道”,
“塔南路287号新兴日化”
],
“姓名”:”诸葛宁盛”,
“手机”:”15613629652″
},{
“地址”:[
“安徽省”,
“合肥市”,
“庐江县”,
“郭河镇”,
“G3京台高速合肥市庐江县广寒桥街道”
],
“姓名”:”冯昔唉”,
“手机”:”18835354291″
},{
“地址”:[
“广西壮族自治区”,
“桂林市”,
“灵川县”,
“潭下镇”,
“004乡道灵川县潭下镇大义村民委员会”
],
“姓名”:”百里屏闷”,
“手机”:”13315249688″
},{
“地址”:[
“天津”,
“天津市”,
“河北区”,
“月牙河街道”,
“58号大江里楼”
],
“姓名”:”徐扼负”,
“手机”:”13289199578″
},{
“地址”:[
“辽宁省”,
“抚顺市”,
“新抚区”,
“新抚街道”,
“福民路”,
“41号”,
“双桥社区北区”
],
“姓名”:”凤干挨”,
“手机”:”15559696768″
},{
“地址”:[
“天津”,
“天津市”,
“南开区”,
“万兴街道”,
“白堤路”,
“164号”,
“风荷东园5号楼”
],
“姓名”:”詹鸵”,
“手机”:”15224524195″
},{
“地址”:[
“湖南省”,
“娄底市”,
“冷水江市”,
“三尖镇”,
“”,
“”,
“石槽村人民政府”
],
“姓名”:”蔺脚贺”,
“手机”:”15581828223″
} - 代码覆盖率
利用Eclipse自带的Coverage测出
结果发现,未覆盖及少量覆盖代码行均为抛异常
注:为减少页面长度有一些常规方法如extractRegular():正则提取地点规范方法。此类修整方法均未在代码段展出。
7.异常处理
- 1
if(matcher.find())
{
tel = matcher.group();
}else System.out.println("手机号码丢失");
//手机缺失
- 2
switch(input) {
default:System.out.println("难度缺失");
}
//难度缺失