第三次java阶段性总结
一、总结前言
本次总结是关于笔者这一段时间Java学习内容的总结,涉及到最近三次PTA大作业,题目主题是电信计费,相比之前的点线型要简单不少。
二、设计与分析
第六次和第七次的大作业属于继承关系,所以就只选择第七次进行解析。
题目:
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
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
输入:
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题在电信计费系列1基础上增加类型1-手机实时计费。
手机设置0或者座机设置成1,此种错误可不做判断。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
座机打手机:
t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
手机互打:
t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
public class Main {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        Scanner scan = new Scanner(System.in);
        String info = scan.nextLine();
        while (!"end".equals(info)) {
            if (info.startsWith("u-")) {
                if(!(info.startsWith("u-0")||info.startsWith("u-1"))){
                    info = scan.nextLine();
                    continue;
                }
                String[] userInfoArr = info.split(" ");
                User user = new User();
                UserRecords userRecords = new UserRecords();
                List<CallRecord> callingInCityRecords = new ArrayList<>();
                List<CallRecord> callingInProvinceRecords = new ArrayList<>();
                List<CallRecord> callingInLandRecords = new ArrayList<>();
                user.setNumber(userInfoArr[0].substring(2));
                if (userInfoArr[1].equals("0")) {
                    LandlinePhoneCharging landlinePhoneCharging = new LandlinePhoneCharging();
                    user.setChargeMode(landlinePhoneCharging);
                }else if(userInfoArr[1].equals("1")){
                    user.setChargeMode(new PhoneCharging());
                }
                userRecords.setCallingInCityRecords(callingInCityRecords);
                userRecords.setCallingInProvinceRecords(callingInProvinceRecords);
                userRecords.setCallingInLandRecords(callingInLandRecords);
                userRecords.setAnswerInLandRecords(new ArrayList<CallRecord>());
                userRecords.setManyouInProvince(new ArrayList<CallRecord>());
                userRecords.setManyouInLand(new ArrayList<CallRecord>());
                user.setUserRecords(userRecords);
                userList.add(user);
                info = scan.nextLine();
            } else if (info.startsWith("t-")) {
                String record = info;
                String[] recordArr = record.split(" ");
                if(recordArr.length == 6) {
                    CallRecord callRecord = new CallRecord();
                    callRecord.setCallingNumber(recordArr[0].substring(2));
                    callRecord.setAnswerNumber(recordArr[1]);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                    String startTimeStr = recordArr[2] + " " + recordArr[3];
                    String endTimeStr = recordArr[4] + " " + recordArr[5];
                    String pattern = "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(.(0[1-9]|1[0-2]|[1-9])(.(0[1-9]|[1-2][0-9]|3[0-1]|[1-9]))?)? ([01]?[0-9]|2[0-3])(:[0-5]?[0-9](:[0-5]?[0-9]|60)?)?";
                    if (!(Pattern.matches(pattern, startTimeStr) && Pattern.matches(pattern, endTimeStr))) {
                        record = scan.nextLine();
                        continue;
                    }
                    Date startDate = null;
                    Date endDate = null;
                    try {
                        startDate = sdf.parse(startTimeStr);
                        endDate = sdf.parse(endTimeStr);
                    } catch (ParseException e) {
                        info = scan.nextLine();
                        continue;
                    }
                    callRecord.setStartTime(startDate);
                    callRecord.setEndTime(endDate);
                    callRecord.setCallingAddressAreaCode(callRecord.getCallingNumber().substring(0, 4));
                    callRecord.setAnswerAddressAreaCode(callRecord.getAnswerNumber().substring(0, 4));
                    if ("0791".equals(callRecord.getAnswerAddressAreaCode())) {
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.callingNumber)) {
                                user.getUserRecords().getCallingInCityRecords().add(callRecord);
                            }
                        }
                    } else if ("0790".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0792".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0791".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0793".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0794".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0795".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0796".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0797".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0798".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0799".equals(callRecord.getAnswerAddressAreaCode()) ||
                            "0701".equals(callRecord.getAnswerAddressAreaCode())
                    ) {
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.callingNumber)) {
                                user.getUserRecords().getCallingInProvinceRecords().add(callRecord);
                            }
                        }
                    } else {
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.callingNumber)) {
                                user.getUserRecords().getCallingInLandRecords().add(callRecord);
                            }
                        }
                    }
                    info = scan.nextLine();
                }else if(recordArr.length == 8){
                    CallRecord callRecord = new CallRecord();
                    callRecord.setCallingNumber(recordArr[0].substring(2));
                    callRecord.setCallingAddressAreaCode(recordArr[1]);
                    callRecord.setAnswerNumber(recordArr[2]);
                    callRecord.setAnswerAddressAreaCode(recordArr[3]);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                    String startTimeStr = recordArr[4] + " " + recordArr[5];
                    String endTimeStr = recordArr[6] + " " + recordArr[7];
                    String pattern = "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(.(0[1-9]|1[0-2]|[1-9])(.(0[1-9]|[1-2][0-9]|3[0-1]|[1-9]))?)? ([01]?[0-9]|2[0-3])(:[0-5]?[0-9](:[0-5]?[0-9]|60)?)?";
                    if (!(Pattern.matches(pattern, startTimeStr) && Pattern.matches(pattern, endTimeStr))) {
                        record = scan.nextLine();
                        continue;
                    }
                    Date startDate = null;
                    Date endDate = null;
                    try {
                        startDate = sdf.parse(startTimeStr);
                        endDate = sdf.parse(endTimeStr);
                    } catch (ParseException e) {
                        info = scan.nextLine();
                        continue;
                    }
                    callRecord.setStartTime(startDate);
                    callRecord.setEndTime(endDate);
                    if("0791".equals(callRecord.getCallingAddressAreaCode())){
                        if("0791".equals(callRecord.getAnswerAddressAreaCode())){
                            for (User user :
                                    userList) {
                                if (callRecord.getCallingNumber().equals(user.getNumber())){
                                    user.getUserRecords().getCallingInCityRecords().add(callRecord);
                                }
                            }
                        }else if("0790".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0792".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0791".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0793".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0794".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0795".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0796".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0797".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0798".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0799".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0701".equals(callRecord.getAnswerAddressAreaCode())
                        ) {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getCallingNumber())){
                                    user.getUserRecords().getCallingInProvinceRecords().add(callRecord);
                                }
                            }
                        }else {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getCallingNumber())){
                                    user.getUserRecords().getCallingInLandRecords().add(callRecord);
                                }
                            }
                        }
                    }else if("0790".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0792".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0791".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0793".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0794".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0795".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0796".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0797".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0798".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0799".equals(callRecord.getCallingAddressAreaCode()) ||
                            "0701".equals(callRecord.getCallingAddressAreaCode())
                    ) {
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.getCallingNumber())){
                                user.getUserRecords().getManyouInProvince().add(callRecord);
                            }
                        }
                    }else {
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.getCallingNumber())){
                                user.getUserRecords().getManyouInLand().add(callRecord);
                            }
                        }
                    }
                    if(!("0791".equals(callRecord.getAnswerAddressAreaCode()))){
                        for (User user :
                                userList) {
                            if (user.getNumber().equals(callRecord.getAnswerNumber())){
                                user.getUserRecords().getAnswerInLandRecords().add(callRecord);
                            }
                        }
                    }
                    info = scan.nextLine();
                }else if(recordArr.length == 7){
                    if(recordArr[0].startsWith("t-1")){
                        CallRecord callRecord = new CallRecord();
                        callRecord.setCallingNumber(recordArr[0].substring(2));
                        callRecord.setCallingAddressAreaCode(recordArr[1]);
                        callRecord.setAnswerNumber(recordArr[2]);
                        callRecord.setAnswerAddressAreaCode(recordArr[2].substring(0,4));
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                        String startTimeStr = recordArr[3] + " " + recordArr[4];
                        String endTimeStr = recordArr[5] + " " + recordArr[6];
                        String pattern = "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(.(0[1-9]|1[0-2]|[1-9])(.(0[1-9]|[1-2][0-9]|3[0-1]|[1-9]))?)? ([01]?[0-9]|2[0-3])(:[0-5]?[0-9](:[0-5]?[0-9]|60)?)?";
                        if (!(Pattern.matches(pattern, startTimeStr) && Pattern.matches(pattern, endTimeStr))) {
                            record = scan.nextLine();
                            continue;
                        }
                        Date startDate = null;
                        Date endDate = null;
                        try {
                            startDate = sdf.parse(startTimeStr);
                            endDate = sdf.parse(endTimeStr);
                        } catch (ParseException e) {
                            info = scan.nextLine();
                            continue;
                        }
                        callRecord.setStartTime(startDate);
                        callRecord.setEndTime(endDate);
                        if("0791".equals(callRecord.getCallingAddressAreaCode())){
                            if("0791".equals(callRecord.getAnswerAddressAreaCode())){
                                for (User user :
                                        userList) {
                                    if (callRecord.getCallingNumber().equals(user.getNumber())){
                                        user.getUserRecords().getCallingInCityRecords().add(callRecord);
                                    }
                                }
                            }else if("0790".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0792".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0791".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0793".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0794".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0795".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0796".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0797".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0798".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0799".equals(callRecord.getAnswerAddressAreaCode()) ||
                                    "0701".equals(callRecord.getAnswerAddressAreaCode())
                            ) {
                                for (User user :
                                        userList) {
                                    if (user.getNumber().equals(callRecord.getCallingNumber())){
                                        user.getUserRecords().getCallingInProvinceRecords().add(callRecord);
                                    }
                                }
                            }else {
                                for (User user :
                                        userList) {
                                    if (user.getNumber().equals(callRecord.getCallingNumber())){
                                        user.getUserRecords().getCallingInLandRecords().add(callRecord);
                                    }
                                }
                            }
                        }else if("0790".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0792".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0791".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0793".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0794".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0795".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0796".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0797".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0798".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0799".equals(callRecord.getCallingAddressAreaCode()) ||
                                "0701".equals(callRecord.getCallingAddressAreaCode())
                        ) {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getCallingNumber())){
                                    user.getUserRecords().getManyouInProvince().add(callRecord);
                                }
                            }
                        }else {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getCallingNumber())){
                                    user.getUserRecords().getManyouInLand().add(callRecord);
                                }
                            }
                        }
                        if(!("0791".equals(callRecord.getAnswerAddressAreaCode()))){
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getAnswerNumber())){
                                    user.getUserRecords().getAnswerInLandRecords().add(callRecord);
                                }
                            }
                        }
                        info = scan.nextLine();
                    }else if(recordArr[0].startsWith("t-0")){
                        CallRecord callRecord = new CallRecord();
                        callRecord.setCallingNumber(recordArr[0].substring(2));
                        callRecord.setCallingAddressAreaCode(recordArr[0].substring(2, 5));
                        callRecord.setAnswerNumber(recordArr[1]);
                        callRecord.setAnswerAddressAreaCode(recordArr[2]);
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                        String startTimeStr = recordArr[3] + " " + recordArr[4];
                        String endTimeStr = recordArr[5] + " " + recordArr[6];
                        String pattern = "([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)(.(0[1-9]|1[0-2]|[1-9])(.(0[1-9]|[1-2][0-9]|3[0-1]|[1-9]))?)? ([01]?[0-9]|2[0-3])(:[0-5]?[0-9](:[0-5]?[0-9]|60)?)?";
                        if (!(Pattern.matches(pattern, startTimeStr) && Pattern.matches(pattern, endTimeStr))) {
                            record = scan.nextLine();
                            continue;
                        }
                        Date startDate = null;
                        Date endDate = null;
                        try {
                            startDate = sdf.parse(startTimeStr);
                            endDate = sdf.parse(endTimeStr);
                        } catch (ParseException e) {
                            info = scan.nextLine();
                            continue;
                        }
                        callRecord.setStartTime(startDate);
                        callRecord.setEndTime(endDate);
                        if(!("0791".equals(callRecord.getAnswerAddressAreaCode()))){
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.getAnswerNumber())){
                                    user.getUserRecords().getAnswerInLandRecords().add(callRecord);
                                }
                            }
                        }
                        if ("0791".equals(callRecord.getAnswerAddressAreaCode())) {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.callingNumber)) {
                                    user.getUserRecords().getCallingInCityRecords().add(callRecord);
                                }
                            }
                        } else if ("0790".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0792".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0791".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0793".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0794".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0795".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0796".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0797".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0798".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0799".equals(callRecord.getAnswerAddressAreaCode()) ||
                                "0701".equals(callRecord.getAnswerAddressAreaCode())
                        ) {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.callingNumber)) {
                                    user.getUserRecords().getCallingInProvinceRecords().add(callRecord);
                                }
                            }
                        } else {
                            for (User user :
                                    userList) {
                                if (user.getNumber().equals(callRecord.callingNumber)) {
                                    user.getUserRecords().getCallingInLandRecords().add(callRecord);
                                }
                            }
                        }
                        info = scan.nextLine();
                    }
                }
            }else {
                info = scan.nextLine();
            }
        }
        Collections.sort(userList);
        for (User value : userList) {
            System.out.println(value.getNumber() + " " + (String.format("%.1f",value.calCost()) + " " + value.calBalance()));
        }
    }
}
class User implements Comparable<User>{
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
    public double calBalance() {
        return balance - calCost() - chargeMode.getMonthlyRent();
    }
    public double calCost() {
        return chargeMode.calCost(userRecords);
    }
    public UserRecords getUserRecords() {
        return userRecords;
    }
    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }
    public double getBalance() {
        return balance;
    }
    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;
    }
    @Override
    public int compareTo(User o) {
        return this.getNumber().compareTo(o.getNumber());
    }
}
class UserRecords {
    private List<CallRecord> callingInCityRecords = new ArrayList<>();
    private List<CallRecord> callingInProvinceRecords = new ArrayList<>();
    private List<CallRecord> callingInLandRecords = new ArrayList<>();
    private List<CallRecord> answerInCityRecords = new ArrayList<>();
    private List<CallRecord> answerInProvinceRecords = new ArrayList<>();
    private List<CallRecord> answerInLandRecords = new ArrayList<>();
    private List<CallRecord> manyouInProvince = new ArrayList<>();
    private List<CallRecord> manyouInLand = new ArrayList<>();
    private List<MessageRecord> sendMessageRecords = new ArrayList<>();
    private List<MessageRecord> receiveMessageRecords = new ArrayList<>();
    public List<CallRecord> getManyouInProvince() {
        return manyouInProvince;
    }
    public void setManyouInProvince(List<CallRecord> manyouInProvince) {
        this.manyouInProvince = manyouInProvince;
    }
    public List<CallRecord> getManyouInLand() {
        return manyouInLand;
    }
    public void setManyouInLand(List<CallRecord> manyouInLand) {
        this.manyouInLand = manyouInLand;
    }
    public List<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }
    public void setCallingInCityRecords(List<CallRecord> callingInCityRecords) {
        this.callingInCityRecords = callingInCityRecords;
    }
    public List<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }
    public void setCallingInProvinceRecords(List<CallRecord> callingInProvinceRecords) {
        this.callingInProvinceRecords = callingInProvinceRecords;
    }
    public List<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }
    public void setCallingInLandRecords(List<CallRecord> callingInLandRecords) {
        this.callingInLandRecords = callingInLandRecords;
    }
    public List<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }
    public void setAnswerInCityRecords(List<CallRecord> answerInCityRecords) {
        this.answerInCityRecords = answerInCityRecords;
    }
    public List<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }
    public void setAnswerInProvinceRecords(List<CallRecord> answerInProvinceRecords) {
        this.answerInProvinceRecords = answerInProvinceRecords;
    }
    public List<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }
    public void setAnswerInLandRecords(List<CallRecord> answerInLandRecords) {
        this.answerInLandRecords = answerInLandRecords;
    }
    public List<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }
    public void setSendMessageRecords(List<MessageRecord> sendMessageRecords) {
        this.sendMessageRecords = sendMessageRecords;
    }
    public List<MessageRecord> getReceiveMessageRecords() {
        return receiveMessageRecords;
    }
    public void setReceiveMessageRecords(List<MessageRecord> receiveMessageRecords) {
        this.receiveMessageRecords = receiveMessageRecords;
    }
}
class CallRecord extends CommunicationRecord {
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private String 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 MessageRecord extends CommunicationRecord {
    private String message;
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}
abstract class ChargeMode {
    ArrayList<ChargeRule> chargeRules = new ArrayList<>();
    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }
    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }
abstract double calCost(UserRecords userRecords);
    abstract double getMonthlyRent();
}
abstract class ChargeRule {
    public abstract double calCost(ArrayList<CallRecord> callRecords);
}
abstract class CallChargeRule extends ChargeRule {
    public abstract double calCost(ArrayList<CallRecord> callRecords);
}
class LandPhoneInCityRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.1 * minute;
        }
        return cost;
    }
}
class LandPhoneInProvinceRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.3 * minute;
        }
        return cost;
    }
}
class LandPhoneInLandRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int minute = 0;
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += minute * 0.6;
        }
        return cost;
    }
}
class LandlinePhoneCharging extends ChargeMode {
    private double monthlyRent = 20;
    public LandlinePhoneCharging() {
        chargeRules.add(new LandPhoneInCityRule());
        chargeRules.add(new LandPhoneInProvinceRule());
        chargeRules.add(new LandPhoneInLandRule());
    }
    @Override
    double calCost(UserRecords userRecords) {
        List<CallRecord> callingInCityRecords = userRecords.getCallingInCityRecords();
        List<CallRecord> callingInProvinceRecords = userRecords.getCallingInProvinceRecords();
        List<CallRecord> callingInLandRecords = userRecords.getCallingInLandRecords();
        double cityCost = chargeRules.get(0).calCost((ArrayList<CallRecord>) callingInCityRecords);
        double provinceCost = chargeRules.get(1).calCost((ArrayList<CallRecord>) callingInProvinceRecords);
        double landCost = chargeRules.get(2).calCost((ArrayList<CallRecord>) callingInLandRecords);
        return cityCost + provinceCost + landCost;
    }
    @Override
    double getMonthlyRent() {
        return monthlyRent;
    }
}
class PhoneCharging extends ChargeMode {
    private double monthlyRent = 15;
    public PhoneCharging() {
        chargeRules.add(new PhoneCallInCityRule());
        chargeRules.add(new PhoneCallInProvinceRule());
        chargeRules.add(new PhoneCallInLandRule());
        chargeRules.add(new PhoneAnswerInLandRule());
        chargeRules.add(new PhoneProvinceManyouRule());
        chargeRules.add(new PhoneLandManyouRule());
    }
    @Override
    double calCost(UserRecords userRecords) {
        List<CallRecord> callingInCityRecords = userRecords.getCallingInCityRecords();
        List<CallRecord> callingInProvinceRecords = userRecords.getCallingInProvinceRecords();
        List<CallRecord> callingInLandRecords = userRecords.getCallingInLandRecords();
        List<CallRecord> answerInLandRecords = userRecords.getAnswerInLandRecords();
        List<CallRecord> manyouInProvince = userRecords.getManyouInProvince();
        List<CallRecord> manyouInLand = userRecords.getManyouInLand();
        double cityCost = chargeRules.get(0).calCost((ArrayList<CallRecord>) callingInCityRecords);
        double provinceCost = chargeRules.get(1).calCost((ArrayList<CallRecord>) callingInProvinceRecords);
        double landCost = chargeRules.get(2).calCost((ArrayList<CallRecord>) callingInLandRecords) + chargeRules.get(3).calCost((ArrayList<CallRecord>) answerInLandRecords);
        double manyou = chargeRules.get(4).calCost((ArrayList<CallRecord>) manyouInProvince) + chargeRules.get(5).calCost((ArrayList<CallRecord>) manyouInLand);
        return cityCost + provinceCost + landCost + manyou;
    }
    @Override
    double getMonthlyRent() {
        return monthlyRent;
    }
}
class PhoneCallInCityRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.1 * minute;
        }
        return cost;
    }
}
class PhoneCallInProvinceRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.2 * minute;
        }
        return cost;
    }
}
class PhoneCallInLandRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.3 * minute;
        }
        return cost;
    }
}
class PhoneProvinceManyouRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.3 * minute;
        }
        return cost;
    }
}
class PhoneLandManyouRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.6 * minute;
        }
        return cost;
    }
}
class PhoneAnswerInLandRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        int minute = 0;
        double cost = 0;
        for (CallRecord record :
                callRecords) {
            int second = (int) (record.getEndTime().getTime() - record.getStartTime().getTime()) / 1000;
            if (second % 60 != 0) {
                minute = second / 60 + 1;
            } else {
                minute = second / 60;
            }
            cost += 0.3 * minute;
        }
        return cost;
    }
}
abstract class CommunicationRecord {
    protected String callingNumber;
    protected String answerNumber;
    public String getCallingNumber() {
        return callingNumber;
    }
    public void setCallingNumber(String callingNumber) {
        this.callingNumber = callingNumber;
    }
    public String getAnswerNumber() {
        return answerNumber;
    }
    public void setAnswerNumber(String answerNumber) {
        this.answerNumber = answerNumber;
    }
}
三、踩坑心得
这三次大作业还是踩到了坑的,比如第七次大作业,笔者做的时候因为一个bug一直通不过去,通过debug一步一步慢慢的查慢慢的看才找到是在前面计费种类错了把手机的计费记作了座机的计费,所以在设计的时候一定要明确,在第三个题目集的计算中,需要注意短信的长度,根据短信的长度计算不同的收费。
四、改进建议
改进意见的话就是题目可以稍微严谨一点,可以多给一些测试样例,希望可以多多给些类图,方便打出框架。可以考虑采用继承的方法去实现对手机,座机信息的提取和判断,从而减少代码的重复。
五、总结
总的来说,这三次大作业难度对于我来说还是很高的,也没有完成的很好,仅仅是及格线边缘,希望后续的学习中我能够攻克这一部分的知识,再多多做类似的题目,提高自己的java编程能力。也希望老师可以多多讲解一些相关题目,方便更好理解。
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号