blog3
(1)前言:
最近三次PTA的题目是关于移动业务资费问题,在其中涉及抽象类、继承关系。
题量、难度等有所降低,由于题目是迭代关系。
第一次的完成为后续问题的解决打下了坚实的基础,所以后续的问题做起来也轻松许多。
(2)设计与分析:
初次移动业务资费问题迭代:


(3)踩坑心得:


在写正则表达式的时候会出错,时间格式错误或者少判断手机区号的类型
String format2 = "[t]-0791[0-9]{7,8}\\s" + "0[0-9]{9,11}\\s" +
"((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.(" +
"[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|(((" +
"[0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))" +
"\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s" +
"((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.(" +
"[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|(((" +
"[0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))" +
"\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])";
在第一次迭代之后第二次在第一次任务之上添加了手机的套餐计费方式

//----------------手机用户
class LandPhoneInCityRule1 extends CallChargeRule{//市内打市内
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost = 0;
for(int i = 0;i < callRecords.size();i ++) {
cost += callRecords.get(i).getDuringTime() * 0.1;
}
return cost;
}
}
class LandPhoneInCityRule2 extends CallChargeRule{//市内打省内
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost = 0;
for(int i = 0;i < callRecords.size();i ++) {
cost += callRecords.get(i).getDuringTime() * 0.2;
}
return cost;
}
}
class LandPhoneInCityRule3 extends CallChargeRule{//市内打省外
@Override
public double calCost(ArrayList<CallRecord> callRecords) {
double cost = 0;
for(int i = 0;i < callRecords.size();i ++) {
cost += callRecords.get(i).getDuringTime() * 0.3;
}
return cost;
}
}
其中我认为最重要的部分就是手机拨号不同地区的号码
重新实现抽象类中的方法,并且在UserRecords类中添加相应手机的记录方法
在手机打手机的测试点中前一个手机未开户后一个手机开户了,在循环中会因为找不到链表中的记录而赋值错误,修改后:
if(rio91) {//手机打手机 t-18907910010 0791 13986300001 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
int flag=0;
for(int i=0;i<users.size();i++) {
if(data[1].equals(users.get(i).getNumber())) {
flag=1;
}
}if(flag==1) {
boolean rio15 = Pattern.matches(rule5,data[4]);
boolean rio16 = Pattern.matches(rule6,data[4]);
boolean rio17 = Pattern.matches(rule7,data[4]);
boolean rio18 = Pattern.matches(rule5,data[2]);
boolean rio19 = Pattern.matches(rule6,data[2]);
boolean rio20 = Pattern.matches(rule7,data[2]);
SimpleDateFormat formatTime = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
formatTime.setLenient(false);
Date date1 = null;
Date date2 = null;
String d1 = data[5]+" "+data[6];
date1 = formatTime.parse(d1);
String d2 = data[7]+" "+data[8];
date2 = formatTime.parse(d2);
callRecord.setStartTime(date1);
callRecord.setEndTime(date2);
int k=0;
for(;k<users.size();k++) {
if(data[1].equals(users.get(k).getNumber())) {
break;
}
}
if(rio18&&rio15) {
users.get(k).getUserRecords().addCallingInCityRecords1(callRecord);
}
else if(rio18&&rio16) {
users.get(k).getUserRecords().addCallingInCityRecords2(callRecord);
}
else if(rio18&&rio17) {
//userRecords.addCallingInLandRecords(callRecord);
for(int l=0;l<users.size();l++) {
if(data[3].equals(users.get(l).getNumber())) {
users.get(l).getUserRecords().addCallingInLandRecords2(callRecord);
break;
}
}
//System.out.println(k);
//System.out.println(users.size());
users.get(k).getUserRecords().addCallingInCityRecords3(callRecord);
}
else if((rio19&&rio15)||(rio19&&rio16)) {
users.get(k).getUserRecords().addCallingInProvinceRecords1(callRecord);
}
else if(rio19&&rio17) {
for(int l=0;l<users.size();l++) {
if(data[3].equals(users.get(l).getNumber())) {
users.get(l).getUserRecords().addCallingInLandRecords2(callRecord);
break;
}
}
users.get(k).getUserRecords().addCallingInProvinceRecords1(callRecord);
}
else if((rio20&&rio15)||(rio20&&rio16)) {
users.get(k).getUserRecords().addCallingInLandRecords1(callRecord);
}
else if(rio20&&rio17) {
for(int l=0;l<users.size();l++) {
if(data[3].equals(users.get(l).getNumber())) {
users.get(l).getUserRecords().addCallingInLandRecords2(callRecord);
break;
}
}
users.get(k).getUserRecords().addCallingInLandRecords1(callRecord);
}
}
else if(flag==0){
boolean rio15 = Pattern.matches(rule5,data[4]);
boolean rio16 = Pattern.matches(rule6,data[4]);
boolean rio17 = Pattern.matches(rule7,data[4]);
boolean rio18 = Pattern.matches(rule5,data[2]);
boolean rio19 = Pattern.matches(rule6,data[2]);
boolean rio20 = Pattern.matches(rule7,data[2]);
for(int i=0;i<users.size();i++) {
if(data[3].equals(users.get(i).getNumber())) {
if(rio15&&rio16){
break;
}
else{
SimpleDateFormat formatTime = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
formatTime.setLenient(false);
Date date1 = null;
Date date2 = null;
String d1 = data[5]+" "+data[6];
date1 = formatTime.parse(d1);
String d2 = data[7]+" "+data[8];
date2 = formatTime.parse(d2);
callRecord.setStartTime(date1);
callRecord.setEndTime(date2);
users.get(i).getUserRecords().addCallingInLandRecords2(callRecord);
break;
}
}
}
}
}
}
}
第三次

追加一个短信的计费方式,这是其中最简单的一次迭代

但是在一开始主方法中没有将发短信的的记录传入UserRecords中导致扣费计算错误
(4)改进建议:
在对代码进行实现的时候,要先读懂需求,明确要求做事,计算好每一种情况。先进行设计再对代码进行实现。在类图复杂、关系复杂的情况下,一定要先读懂没一个类、每一个方法的作用
(5)总结:
对抽象类、实现抽象类中的方法有了更深层次的理解
对于代码的复用性有了更深的理解,知道该如何去设计方法来提升代码的复用性

浙公网安备 33010602011771号