移动业务资费问题的总结性Blog
一、前言
1、经过了这几周的学习(12-15)周,我们学习了java的封装、继承、多态、接口、抽象类、集合框架,javaFX,java项目编程原则:单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则(最少知道原则),开闭原则,正则表达式,lamba表达式,内部类,逻辑思维能力,全面考虑问题的能力,方法编写能力等知识。
2、我们在pta主要做移动业务资费问题,一共三题,分别为迭代作业。由于老师给了类图,所以难度降低了一点(但是对我来说,还是困难),第一题写的很困难,但是如果你写完后,后面会更简单。
3、我的做题时间比较长,因为我基础不太好,但是最后也写完了,在同学和百度的帮助下。
二、设计与分析
1.7-1 电信计费系列1-座机计费
***题目信息如下:
实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
***本题的类图如下:

***题目代码如下:
import java.util.ArrayList; import java.util.Scanner; import java.util.TreeMap; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; public class Main { public static void main(String[] args) { Scanner in =new Scanner(System.in); String a = in.nextLine(); String s1 = "^u-\\d{11,12}\\s(0|1|2)$"; //String s2 = "^t-\\d{11,12}\\s\\d{11,12}\\s\\d{4}.\\d{1}.\\d{1}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1}.\\d{1}\\s\\d{2}:\\d{2}:\\d{2}$"; String s2="t-(\\d){11,12}\\s(\\d){11,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; //while(!a.equals("end")) { TreeMap<String,User> treeMap = new TreeMap<String,User>(); while(!a.equals("end")) { if(a.matches(s1)){ String[] c = a.split("-"); String[] d = c[1].split(" "); String d1 = d[0].substring(4); ChargeMode chargeMode = new LandlinePhoneCharging(); User user=new User(d1,chargeMode); treeMap.put(d1,user); } if(a.matches(s2)){ String[] e = a.split("-"); String[] f = e[1].split(" "); String stime=f[2]+" "+f[3]; String etime=f[4]+" "+f[5]; Date starttime = new Date(); Date endtime = new Date(); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); } CallRecord cal = new CallRecord(starttime,endtime,f[0].substring(0, 4),f[1].substring(0, 4)); if(treeMap.get(f[0].substring(4))!=null){ if(f[1].substring(0, 4).equals("0791")) { treeMap.get(f[0].substring(4)).getUserRecords().addCallingInCityRecords(cal); } else if(f[1].substring(0,4).equals("0701")||f[1].substring(0, 4).equals("0790")||f[1].substring(0, 4).equals("0792")||f[1].substring(0, 4).equals("0793")||f[1].substring(0, 4).equals("0794")||f[1].substring(0, 4).equals("0795")||f[1].substring(0, 4).equals("0796")||f[1].substring(0, 4).equals("0797")||f[1].substring(0, 4).equals("0798")||f[1].substring(0, 4).equals("0799")) { treeMap.get(f[0].substring(4)).getUserRecords().addCallingInProvinceRecords(cal); } else { treeMap.get(f[0].substring(4)).getUserRecords().addCallingInLandRecords(cal); } } } a = in.nextLine(); } for(User user:treeMap.values()) { System.out.print("0791"+user.getNumber()+" "); System.out.printf("%.1f %.1f\n",user.calCost(),user.calBalance()); } } } abstract class CallChargeRule extends ChargeRule { public double calCost(ArrayList<CallRecord> callRecords) { return 0; } } class CallRecord extends CommunicationRecord{ private Date startTime; private Date endTime; private String callingAddressAreaCode; private String answerAddressAreaCode; public CallRecord(Date startTime, Date endTime,String callingAddressAreaCode,String answerAddressAreaCode) { super(); this.startTime = startTime; this.endTime = endTime; this.callingAddressAreaCode = callingAddressAreaCode; this.answerAddressAreaCode = answerAddressAreaCode; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public String getCallingAddressAreaCode() { return callingAddressAreaCode; } public void setCallingAddressAreaCode(String callingAddressAreaCode) { this.callingAddressAreaCode = callingAddressAreaCode; } public String getAnswerAddressAreaCode() { return answerAddressAreaCode; } public void setAnswerAddressAreaCode(String answerAddressAreaCode) { this.answerAddressAreaCode = answerAddressAreaCode; } } abstract class ChargeMode { ArrayList<ChargeRule> chargeRules = new ArrayList<>(); public ArrayList<ChargeRule> getChargeRules() { return chargeRules; } public void setChargeRules(ArrayList<ChargeRule> chargeRules) { this.chargeRules = chargeRules; } public double calCost(UserRecords userRecords) { return 0; } public double getMonthlyRent() { return 0; } } abstract class ChargeRule { public abstract double CalCost(ArrayList<CallRecord> callRecords) ; //public abstract double calCost(ArrayList<CallRecord> callRecords); } abstract class CommunicationRecord { protected String callingNumber; protected String answeringNumber; public String getCallingNumber() { return callingNumber; } public void setCallingNumber(String callingNumber) { this.callingNumber = callingNumber; } public String getAnsweringNumber() { return answeringNumber; } public void setAnsweringNumber(String answeringNumber) { this.answeringNumber = answeringNumber; } } class LandlinePhoneCharging extends ChargeMode { protected double monthlyRent = 20; public double getMonthlyRent() { return monthlyRent; } public double calCost(UserRecords userRecords) { getChargeRules().add(new LandPhoneInCityRule()); getChargeRules().add(new LandPhoneInLandRule()); getChargeRules().add(new LandPhoneInProvinceRule()); double ans = 0 ; double a = super.getChargeRules().get(0).CalCost(userRecords.getCallingInCityRecords()); double b = super.getChargeRules().get(1).CalCost(userRecords.getCallingInLandRecords()); double c= super.getChargeRules().get(2).CalCost(userRecords.getCallingInProvinceRecords()); ans=a+b+c; return ans; } } class LandPhoneInCityRule extends CallChargeRule{ double s = 0; @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.1*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class LandPhoneInLandRule extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.6*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class LandPhoneInProvinceRule extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class User { UserRecords userRecords = new UserRecords(); private double balance = 100 ; ChargeMode chargemode; private String number; public User(String number, ChargeMode chargemode) { // TODO 自动生成的构造函数存根 this.chargemode=chargemode; this.number=number; } public double getBalance() { return balance ; } public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public double calBalance() { return balance-chargemode.getMonthlyRent()-chargemode.calCost(userRecords); } public double calCost() { return chargemode.calCost(userRecords); } public ChargeMode getChargemode() { return chargemode; } public void setChargemode(ChargeMode chargemode) { this.chargemode = chargemode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } } class UserRecords { ArrayList<CallRecord> CallingInCityRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> CallingInProvinceRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> CallingInLandRecords = new ArrayList<CallRecord>(); public void addCallingInCityRecords(CallRecord callRecord) { CallingInCityRecords.add(callRecord); } public void addCallingInProvinceRecords(CallRecord callRecord) { CallingInProvinceRecords.add(callRecord); } public void addCallingInLandRecords(CallRecord callRecord) { CallingInLandRecords.add(callRecord); } public ArrayList<CallRecord> getCallingInCityRecords() { return CallingInCityRecords; } public ArrayList<CallRecord> getCallingInProvinceRecords() { return CallingInProvinceRecords; } public ArrayList<CallRecord> getCallingInLandRecords() { return CallingInLandRecords; } }
***本题一开始我吧没有思路,后来老师发了类图后,开始有了进展。
(1)首先,我先根据老师的类图,选出本题要用的座机类和关系,然后在编译工具里建好项目和类,慢慢把类补充完整,比如:
LandPhoneInCityRule,LandPhoneInLandRule,LandPhoneInProvinceRule这三个类写那三种座机的计费方式,user和userRecord,chargeMode
的继承写好,communicationRecord和callRecord的继承关系等。
(2)然后,我开始写main函数,先将正则表达式写出,本题一共要写两个,分别匹配座机的格式和通讯信息格式如下:
String s1 = "^u-\\d{11,12}\\s(0|1|2)$";
String s2="t-(\\d){11,12}\\s(\\d){11,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";
(3)然后在主函数里分别写循环开户,匹配正则表达式;
在写3个if语句分别判断3种计费方式。最后,使用foreach循环输出。
我开户时使用了treeMap,开户,输出,排序等操作比较方便。
2、7-1 电信计费系列2-手机+座机计费
***题目信息如下:
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
1、针对市内座机用户采用的计费方式(与电信计费系列1内容相同):
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
2、针对手机用户采用实时计费方式:
月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
u-13307912264 1
t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
chrome-extension://ibllepbpahcoppkjjllbabhnigcbffpi/https://images.ptausercontent.com/825588d3-6c7b-420b-abab-13e36b4c828c.pdf
***该题目类图如下:


***题目源代码如下:
import java.util.ArrayList; import java.util.Scanner; import java.util.TreeMap; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; public class Main { public static void main(String[] args) { Scanner in =new Scanner(System.in); String a = in.nextLine(); String s1 = "u-0\\d{10,11}\\s0"; String s2 = "u-1\\d{10}\\s1"; String s3 ="t-0(\\d){9,11}\\s0(\\d){9,11}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; String s4 = "t-0(\\d){9,11}\\s1(\\d){10}\\s0(\\d){2,3}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}"; String s5 = "t-1(\\d){10}\\s0(\\d){2,3}\\s0\\d{9,11}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}" ; String s6 = "t-1(\\d){10}\\s0(\\d){2,3}\\s1\\d{10}\\s0\\d{2,3}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d"; TreeMap<String,User> treeMap = new TreeMap<String,User>(); while(!a.equals("end")) { if(a.matches(s1)){ String[] c = a.split("-"); String[] d = c[1].split(" "); String d1 = d[0].substring(4); ChargeMode chargeMode = new LandlinePhoneCharging(); User user=new User(d[0],chargeMode); treeMap.put(d[0],user); } if(a.matches(s2)){ String[] c = a.split("-"); String[] d = c[1].split(" "); String d1 = d[0].substring(4); ChargeMode chargeMode = new CellPhoneCharging(); User user=new User(d[0],chargeMode); treeMap.put(d[0],user); } if(a.matches(s3)){ //zj zj String[] e = a.split("-"); String[] f = e[1].split(" "); String stime=f[2]+" "+f[3]; String etime=f[4]+" "+f[5]; Date starttime = new Date(); Date endtime = new Date(); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); } CallRecord cal = new CallRecord(starttime,endtime,f[0].substring(0, 4),f[1].substring(0, 4)); if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ if(f[1].substring(0, 4).equals("0791")) { if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInCityRecords(cal);} } else if(f[1].substring(0,4).equals("0701")||f[1].substring(0, 4).equals("0790")||f[1].substring(0, 4).equals("0792")||f[1].substring(0, 4).equals("0793")||f[1].substring(0, 4).equals("0794")||f[1].substring(0, 4).equals("0795")||f[1].substring(0, 4).equals("0796")||f[1].substring(0, 4).equals("0797")||f[1].substring(0, 4).equals("0798")||f[1].substring(0, 4).equals("0799")) { if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInProvinceRecords(cal);} } else { if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInLandRecords(cal);} } } } if(a.matches(s4)){ //zj sj String[] e = a.split("-"); String[] f = e[1].split(" "); String stime=f[3]+" "+f[4]; String etime=f[5]+" "+f[6]; Date starttime = new Date(); Date endtime = new Date(); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); } CallRecord cal = new CallRecord(starttime,endtime,f[0].substring(0, 4),f[2]); if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ if(f[2].equals("0791")) { //if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInCityRecords(cal); } else if(f[2].equals("0701")||f[2].equals("0790")||f[2].equals("0792")||f[2].equals("0793")||f[2].equals("0794")||f[2].equals("0795")||f[2].equals("0796")||f[2].equals("0797")||f[2].equals("0798")||f[2].equals("0799")) { if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInProvinceRecords(cal);} } else { if(treeMap.get(f[0])!=null){ treeMap.get(f[0]).getUserRecords().addCallingInLandRecords(cal); } if(treeMap.get(f[1])!=null){ treeMap.get(f[1]).getUserRecords().addAnswerInLandRecords(cal); } } } } if(a.matches(s5)){ //sj zj String[] e = a.split("-"); String[] f = e[1].split(" "); String stime=f[3]+" "+f[4]; String etime=f[5]+" "+f[6]; Date starttime = new Date(); Date endtime = new Date(); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); } CallRecord cal = new CallRecord(starttime,endtime,f[1],f[2].substring(0,4)); if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ if(f[2].substring(0,4).equals("0791")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInCityRecords(cal);} } else if(f[2].substring(0,4).equals("0701")||f[2].substring(0,4).equals("0790")||f[2].substring(0,4).equals("0792")||f[2].substring(0,4).equals("0793")||f[2].substring(0,4).equals("0794")||f[2].substring(0,4).equals("0795")||f[2].substring(0,4).equals("0796")||f[2].substring(0,4).equals("0797")||f[2].substring(0,4).equals("0798")||f[2].substring(0,4).equals("0799")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInProvinceRecords(cal);} } else { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInLandRecords(cal);} //treeMap.get(f[1]).getUserRecords().addAnswerInLandRecords(cal); } } } if(a.matches(s6)){ //sj sj String[] e = a.split("-"); String[] f = e[1].split(" "); String stime=f[4]+" "+f[5]; String etime=f[6]+" "+f[7]; Date starttime = new Date(); Date endtime = new Date(); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); } CallRecord cal = new CallRecord(starttime,endtime,f[1],f[3]); if(treeMap.size()!=0){ if(f[3].equals("0791")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInCityRecords(cal);} } else if(f[3].equals("0701")||f[3].equals("0790")||f[3].equals("0792")||f[3].equals("0793")||f[3].equals("0794")||f[3].equals("0795")||f[3].equals("0796")||f[3].equals("0797")||f[3].equals("0798")||f[3].equals("0799")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInProvinceRecords(cal);} } else { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInLandRecords(cal);} if(treeMap.get(f[2])!=null&&treeMap.size()!=0){ treeMap.get(f[2]).getUserRecords().addAnswerInLandRecords(cal); } } } } a = in.nextLine(); } for(User user:treeMap.values()) { System.out.print(user.getNumber()+" "); System.out.printf("%.1f %.1f\n",user.calCost(),user.calBalance()); } } } class AnswerPhone extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } abstract class CallChargeRule extends ChargeRule { public double calCost(ArrayList<CallRecord> callRecords) { return 0; } } class CallRecord extends CommunicationRecord{ private Date startTime; private Date endTime; private String callingAddressAreaCode; private String answerAddressAreaCode; public CallRecord(Date startTime, Date endTime,String callingAddressAreaCode,String answerAddressAreaCode) { super(); this.startTime = startTime; this.endTime = endTime; this.callingAddressAreaCode = callingAddressAreaCode; this.answerAddressAreaCode = answerAddressAreaCode; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public String getCallingAddressAreaCode() { return callingAddressAreaCode; } public void setCallingAddressAreaCode(String callingAddressAreaCode) { this.callingAddressAreaCode = callingAddressAreaCode; } public String getAnswerAddressAreaCode() { return answerAddressAreaCode; } public void setAnswerAddressAreaCode(String answerAddressAreaCode) { this.answerAddressAreaCode = answerAddressAreaCode; } } class CellPhoneCharging extends ChargeMode{ protected double monthlyRent = 15; public double getMonthlyRent() { return monthlyRent; } public double calCost(UserRecords userRecords) { getChargeRules().add(new CellPhoneCity()); getChargeRules().add(new CellPhoneLand()); getChargeRules().add(new CellPhoneProvince()); getChargeRules().add(new AnswerPhone()); double ans = 0 ; double a = getChargeRules().get(0).CalCost(userRecords.getCallingInCityRecords()); double b = getChargeRules().get(1).CalCost(userRecords.getCallingInLandRecords()); double c = getChargeRules().get(2).CalCost(userRecords.getCallingInProvinceRecords()); double g = getChargeRules().get(3).CalCost(userRecords.getAnswerInLandRecords()); ans=a+b+c+g; return ans; } } class CellPhoneCity extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { // TODO 自动生成的方法存根 double s = 0; for(CallRecord a : callRecords) { if(a.getCallingAddressAreaCode().equals("0791")) { s = s + 0.1*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } if(a.getCallingAddressAreaCode().matches("079[2-9]|0701|0790")) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } else if(!a.getCallingAddressAreaCode().equals("0791")&&!a.getCallingAddressAreaCode().matches("079[0-9]|0701")){ s = s + 0.6*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } } return s; } } class CellPhoneLand extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { // TODO 自动生成的方法存根 double s = 0; for(CallRecord a : callRecords) { if(a.getCallingAddressAreaCode().equals("0791")) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } if(a.getCallingAddressAreaCode().matches("079[2-9]|0701|0790")) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } else if(!a.getCallingAddressAreaCode().equals("0791")&&!a.getCallingAddressAreaCode().matches("079[0-9]|0701")){ s = s + 0.6*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } } return s; } } class CellPhoneProvince extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { // TODO 自动生成的方法存根 double s = 0; for(CallRecord a : callRecords) { if(a.getCallingAddressAreaCode().equals("0791")) { s = s + 0.2*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } if(a.getCallingAddressAreaCode().matches("079[2-9]|0701|0790")) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } else if(!a.getCallingAddressAreaCode().equals("0791")&&!a.getCallingAddressAreaCode().matches("079[0-9]|0701")){ s = s + 0.6*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } } return s; } } abstract class ChargeMode { ArrayList<ChargeRule> chargeRules = new ArrayList<>(); public ArrayList<ChargeRule> getChargeRules() { return chargeRules; } public void setChargeRules(ArrayList<ChargeRule> chargeRules) { this.chargeRules = chargeRules; } public double calCost(UserRecords userRecords) { return 0; } public double getMonthlyRent() { return 0; } } abstract class ChargeRule { public abstract double CalCost(ArrayList<CallRecord> callRecords) ; } abstract class CommunicationRecord { protected String callingNumber; protected String answeringNumber; public String getCallingNumber() { return callingNumber; } public void setCallingNumber(String callingNumber) { this.callingNumber = callingNumber; } public String getAnsweringNumber() { return answeringNumber; } public void setAnsweringNumber(String answeringNumber) { this.answeringNumber = answeringNumber; } } class LandlinePhoneCharging extends ChargeMode { protected double monthlyRent = 20; public double getMonthlyRent() { return monthlyRent; } public double calCost(UserRecords userRecords) { getChargeRules().add(new LandPhoneInCityRule()); getChargeRules().add(new LandPhoneInLandRule()); getChargeRules().add(new LandPhoneInProvinceRule()); double ans = 0 ; //getAnswerInCityRecords double a = super.getChargeRules().get(0).CalCost(userRecords.getCallingInCityRecords()); double b = super.getChargeRules().get(1).CalCost(userRecords.getCallingInLandRecords()); double c= super.getChargeRules().get(2).CalCost(userRecords.getCallingInProvinceRecords()); ans=a+b+c; return ans; } } class LandPhoneInCityRule extends CallChargeRule{ double s = 0; @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.1*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class LandPhoneInLandRule extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.6*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class LandPhoneInProvinceRule extends CallChargeRule{ @Override public double CalCost(ArrayList<CallRecord> callRecords) { double s = 0; for(CallRecord a : callRecords) { s = s + 0.3*Math.ceil((a.getEndTime().getTime()-a.getStartTime().getTime())/1000.0/60.0); } return s; } } class User { UserRecords userRecords = new UserRecords(); private double balance = 100 ; ChargeMode chargemode; private String number; public User(String number, ChargeMode chargemode) { // TODO 自动生成的构造函数存根 this.chargemode=chargemode; this.number=number; } public double getBalance() { return balance ; } public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public double calBalance() { return balance-chargemode.getMonthlyRent()-chargemode.calCost(userRecords); } public double calCost() { return chargemode.calCost(userRecords); } public ChargeMode getChargemode() { return chargemode; } public void setChargemode(ChargeMode chargemode) { this.chargemode = chargemode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } } class UserRecords { ArrayList<CallRecord> CallingInCityRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> CallingInProvinceRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> CallingInLandRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>(); ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>(); public ArrayList<CallRecord> getAnswerInCityRecords() { return answerInCityRecords; } public void setAnswerInCityRecords(ArrayList<CallRecord> answerInCityRecords) { this.answerInCityRecords = answerInCityRecords; } public ArrayList<CallRecord> getAnswerInProvinceRecords() { return answerInProvinceRecords; } public void setAnswerInProvinceRecords(ArrayList<CallRecord> answerInProvinceRecords) { this.answerInProvinceRecords = answerInProvinceRecords; } public ArrayList<CallRecord> getAnswerInLandRecords() { return answerInLandRecords; } public void setAnswerInLandRecords(ArrayList<CallRecord> answerInLandRecords) { this.answerInLandRecords = answerInLandRecords; } public void addCallingInCityRecords(CallRecord callRecord) { CallingInCityRecords.add(callRecord); } public void addCallingInProvinceRecords(CallRecord callRecord) { CallingInProvinceRecords.add(callRecord); } public void addCallingInLandRecords(CallRecord callRecord) { CallingInLandRecords.add(callRecord); } public void addAnswerInLandRecords(CallRecord CallRecord) { answerInLandRecords.add(CallRecord); } public void addAnswerInProvinceRecords(CallRecord CallRecord) { answerInProvinceRecords.add(CallRecord); } public void addAnswerInCityRecords(CallRecord CallRecord) { answerInCityRecords.add(CallRecord); } public ArrayList<CallRecord> getCallingInCityRecords() { return CallingInCityRecords; } public ArrayList<CallRecord> getCallingInProvinceRecords() { return CallingInProvinceRecords; } public ArrayList<CallRecord> getCallingInLandRecords() { return CallingInLandRecords; } }
***本题我在第一题的基础上进行编写,但是这题难度更大,计费方式更多。
(1)首先,我在第一题的基础上加上了电话计费的类,并补充完整各个类之间的关系。因为之前有座机的计费方式,所以我就只加上了 电话的计费方式,我也分了三种,根据接电话的地区进行分类,并且,它们是chargeRule的子类,user和userRecord,chargeMode
的继承写好,communicationRecord和callRecord的继承关系等进行修改,加上电话计费的内容。
(2)然后,我开始写main函数,也是先写正则表达式,一共要写6个,分别匹配座机的号码格式和手机的号码格式,以及座机打座机,
座机打手机,手机打座机,手机打手机这四种方式。
String s1 = "u-0\\d{10,11}\\s0";
String s2 = "u-1\\d{10}\\s1";
String s3 ="t-0(\\d){9,11}\\s0(\\d){9,11}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";
String s4 = "t-0(\\d){9,11}\\s1(\\d){10}\\s0(\\d){2,3}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}";
String s5 = "t-1(\\d){10}\\s0(\\d){2,3}\\s0\\d{9,11}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}" ;
String s6 = "t-1(\\d){10}\\s0(\\d){2,3}\\s1\\d{10}\\s0\\d{2,3}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";
(3)同第一题,然后在主函数里分别写循环开户,匹配正则表达式,分别匹配座机的号码格式和手机的号码;
在写4个if语句分别判断4种通信方式,在通信方式里写3种地区的情况(根据市内省内国内)。
最后,使用foreach循环输出。
我开户时还使用了treeMap,开户,输出,排序等操作比较方便。
3、7-1 电信计费系列3-短信计费
***题目信息如下:
实现一个简单的电信计费程序,针对手机的短信采用如下计费方式:
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。
输入:
输入信息包括两种类型
1、逐行输入南昌市手机用户开户的信息,每行一个用户。
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费)
例如:u-13305862264 3
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题只针对类型3-手机短信计费。
2、逐行输入本月某些用户的短信信息,短信的格式:
m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成)
m-18907910010 13305862264 welcome to jiangxi.
m-13305862264 18907910010 thank you.
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。
***题目的类图如下:


***题目代码如下:
import java.util.ArrayList; import java.util.Scanner; import java.util.TreeMap; public class Main { public static void main(String[] args) { Scanner in =new Scanner(System.in); String a = in.nextLine(); String s1 = "u-1\\d{10}\\s3"; String s2 = "m-1\\d{10}\\s1\\d{10}\\s([a-z]|[A-Z]|[0-9]|[,]|[.]|[ ]){1,}"; TreeMap<String,User> treeMap = new TreeMap<String,User>(); while(!a.equals("end")) { if(a.matches(s1)){ String[] c = a.split("-"); String[] d = c[1].split(" "); User user=new User(d[0],new MessageCharing()); treeMap.put(d[0],user); } if(a.matches(s2)) { String[] e = a.split("-"); String[] f = e[1].split(" "); MessageRecord cal = new MessageRecord (e[1].substring(24)); //if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ if(treeMap.get(f[0])!=null) treeMap.get(f[0]).getUserRecords().addSendMessageRecords(cal); } //} a = in.nextLine(); } for(User user:treeMap.values()) { System.out.print(user.getNumber()+" "); System.out.printf("%.1f %.1f\n",user.calCost(),user.calBalance()); } } } abstract class ChargeMode { ArrayList<ChargeRule> chargeRules = new ArrayList<>(); public ArrayList<ChargeRule> getChargeRules() { return chargeRules; } public void setChargeRules(ArrayList<ChargeRule> chargeRules) { this.chargeRules = chargeRules; } public double calCost(UserRecords userRecords) { return 0; } } abstract class ChargeRule { public abstract double calCost(ArrayList<MessageRecord> sendMessageRecords); // TODO 自动生成的方法存根 } abstract class CommunicationRecord { protected String callingNumber; protected String answeringNumber; public String getCallingNumber() { return callingNumber; } public void setCallingNumber(String callingNumber) { this.callingNumber = callingNumber; } public String getAnsweringNumber() { return answeringNumber; } public void setAnsweringNumber(String answeringNumber) { this.answeringNumber = answeringNumber; } } abstract class MessageChargeRule extends ChargeRule{ public double calCost(UserRecords userRecords) { // TODO 自动生成的方法存根 return 0; } } class MessageCharing extends ChargeMode { public double calCost(UserRecords userRecords){ getChargeRules().add(new SendMessageRule()); double ans =0; double a = super.getChargeRules().get(0).calCost(userRecords.getSendMessageRecords()); ans = a+ans; return ans; } } class MessageRecord extends CommunicationRecord{ private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MessageRecord(String message) { super(); this.message = message; } } class SendMessageRule extends ChargeRule{ @Override public double calCost(ArrayList<MessageRecord> sendMessageRecords) { // TODO 自动生成的方法存根 int sum = 0; for(MessageRecord b: sendMessageRecords) { sum += (int)(Math.ceil(b.getMessage().length()/10.0)); } if(sum<=3) return sum*0.1; else if(sum<=5) return 0.3+(sum-3)*0.2; else return 0.7+(sum-5)*0.3; } } class User { UserRecords userRecords = new UserRecords(); private double balance = 100 ; private ChargeMode chargemode; private String number; public User(String number,ChargeMode chargemode ) { // TODO 自动生成的构造函数存根 this.chargemode = chargemode; this.number=number; } public double getBalance() { return balance ; } public UserRecords getUserRecords() { return userRecords; } public void setUserRecords(UserRecords userRecords) { this.userRecords = userRecords; } public double calBalance() { return balance-chargemode.calCost(userRecords); } public double calCost() { return chargemode.calCost(userRecords); } public ChargeMode getChargemode() { return chargemode; } public void setChargemode(ChargeMode chargemode) { this.chargemode = chargemode; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } } class UserRecords { ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>(); ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>(); public ArrayList<MessageRecord> getSendMessageRecords() { return sendMessageRecords; } // public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) { // this.sendMessageRecords = sendMessageRecords; // } public ArrayList<MessageRecord> getReceiveMessageRecords() { return receiveMessageRecords; } // public void setReceiveMessageRecords(ArrayList<MessageRecord> receiveMessageRecords) { // this.receiveMessageRecords = receiveMessageRecords; // } public void addSendMessageRecords(MessageRecord sendMessageRecord) { sendMessageRecords.add(sendMessageRecord); } public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) { receiveMessageRecords.add(receiveMessageRecord); } }
***本题因为有了前两题的基础,所以比较简单。
(1)首先我们可以删除前面的CallRecord,callchargeRull等类,因为用不上了,然后照着第而题加上电信计费方式。
(2)写好那三种计费方式,修改删除好其他类后,在写主函数。
(3)先将正则表达式写出,本题一共要写两个。
String s1 = "u-1\\d{10}\\s3";
String s2 = "m-1\\d{10}\\s1\\d{10}\\s([a-z]|[A-Z]|[0-9]|[,]|[.]|[ ]){1,}";
(4)然后在主函数里分别写循环开户,匹配正则表达式;
在写1个if语句,判断1种计费方式。最后,使用foreach循环输出。
三、采坑心得:
1、正则表达式写错了导致无法匹配座机和手机号码:

*解决方法:
可以利用菜鸟工具写正则表达式方便,还可以跟着修改。
2、计算通信时间和打电话的时间错误:
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); try { starttime = sdf3.parse(stime); } catch (ParseException e2) { e2.printStackTrace(); } try { endtime = sdf3.parse(etime); } catch (ParseException e1) { e1.printStackTrace(); }
*解决方法:
使用如图所示的SimpleDateFormat类进行计算时间和日期。
3、用户输出排序问题,就是用户进行输出时没有排序。
*解决方法:
使用treeMape集合,非常实用,开户,输出,排序等操作比较方便。
https://blog.csdn.net/walkerkalr/article/details/81217294
4、忘记没有开户不能输出,也不会报错。
*解决方法:
加上如下代码:
if(f[3].equals("0791")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInCityRecords(cal);} } else if(f[3].equals("0701")||f[3].equals("0790")||f[3].equals("0792")||f[3].equals("0793")||f[3].equals("0794")||f[3].equals("0795")||f[3].equals("0796")||f[3].equals("0797")||f[3].equals("0798")||f[3].equals("0799")) { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInProvinceRecords(cal);} } else { if(treeMap.get(f[0])!=null&&treeMap.size()!=0){ treeMap.get(f[0]).getUserRecords().addCallingInLandRecords(cal);} if(treeMap.get(f[2])!=null&&treeMap.size()!=0){ treeMap.get(f[2]).getUserRecords().addAnswerInLandRecords(cal); }
四、改进建议:
1.首先,我觉得可以将我的正则表达式分开写分别判断,而不是一口气写完,这样更不容易错,比如这两个代码
if(a.substring(0,11).matches("t-0(\\d){9,11}\\s0(\\d){9,11}")) if(a.substring(11,22).matches("u-1\\d{10}\\s1")) if(a.substring(11,22).matches(d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2})
String s5 = "t-1(\\d){10}\\s0(\\d){2,3}\\s0\\d{9,11}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\d{4}.\\d{1,2}.\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}" ;
2.我觉得最后一题通信可以进行改进,变得更简单。
五.总结:
*经过12-15周的学习,我认为我主要还是提升了主在各种数据的处理方面,对类和对象的理解,逻辑思维能力,考虑问题全面能力,类设计能力。
*说实话作业的时间是够写的,但是我感觉有一定难度,移动业务资费问题有一定难度,但是如果第一题写好了,后面就好写了,因为是迭代作业,但是我第二题没有满分;考察了我们对面向对象的思考了,还有集合框架,类设计的思考,不只是考察我们的基本写一些代码的问题了,更多的是考察我们对面向对象这一实质的思考与研究,利用数据的私有和不同类之间的关联,考虑问题的全面性,以及SOLID设计原则,以及状态模式,策略模式的应用。我以后一定要更加努力学习。
*希望老师能多多指导我们,讲一讲题目。最后,希望我们能顺利通过期末考试,取得一个好成绩。
浙公网安备 33010602011771号