移动业务资费问题的总结性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。

chrome-extension://ibllepbpahcoppkjjllbabhnigcbffpi/https://images.ptausercontent.com/d3c5de10-9e3f-4a4c-877f-64e76c98f1b6.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-\\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设计原则,以及状态模式,策略模式的应用。我以后一定要更加努力学习。

*希望老师能多多指导我们,讲一讲题目。最后,希望我们能顺利通过期末考试,取得一个好成绩。

 

 

posted @ 2022-06-16 19:59  星尘中的卡洛斯  阅读(81)  评论(0)    收藏  举报