ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Blog-3-电信计费系列

2022-06-16 22:01:25  阅读:216  来源: 互联网

标签:return get ArrayList interval Blog cost 计费 电信 public


前言

移动业务资费问题的总结性Blog。三次电信计费的题目难度适中,涉及的知识点有继承,多态和异常处理等。题目量也不大。

设计与分析

一、电信计费系列1:座机计费

座机计费代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

import java.util.Date;

abstract class ChargeMode {
    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }

    public abstract double calCost(UserRecords userRecords);

    public abstract double getMonthlyRent();
}


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;
    }
}

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;
    }
}

abstract class ChargeRule {
}


abstract class CallChargeRule extends ChargeRule{

    public abstract double calCost(ArrayList<CallRecord> callRecords);
}


class LandPhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.6;
        }
        return cost;
    }
}



class LandPhoneInCityRule extends CallChargeRule{


    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.1;
        }
        return cost;
    }
}


class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;

    public LandlinePhoneCharging(){
        getChargeRules().add(new LandPhoneInCityRule());
        getChargeRules().add(new LandPhoneInProvinceRule());
        getChargeRules().add(new LandPhoneInLandRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = cost + ((LandPhoneInCityRule)getChargeRules().get(0)).calCost(userRecords.getCallingInCityRecords());
        cost = cost + ((LandPhoneInProvinceRule)getChargeRules().get(1)).calCost(userRecords.getCallingInProvinceRecords());
        cost = cost + ((LandPhoneInLandRule)getChargeRules().get(2)).calCost(userRecords.getCallingInLandRecords());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}


class UserRecords {
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<>();
    private ArrayList<MessageRecord> sendMessageRecord = new ArrayList<>();
    private ArrayList<MessageRecord> receiveMessageRecord = new ArrayList<>();

    public void addCallingCityRecords(CallRecord callRecord){
        callingInCityRecords.add(callRecord);
    }

    public void addCallingInProvinceRecords(CallRecord callRecord){
        callingInProvinceRecords.add(callRecord);
    }

    public void addCallingInLandRecords(CallRecord callRecord){
        callingInLandRecords.add(callRecord);
    }

    public void addAnswerInCityRecords(CallRecord callRecord){
        answerInCityRecords.add(callRecord);
    }

    public void addAnswerInProvinceRecords(CallRecord callRecord){
        answerInProvinceRecords.add(callRecord);
    }

    public void addAnswerInLandRecords(CallRecord callRecord){
        answerInLandRecords.add(callRecord);
    }

    public void addReceiveMessageRecords(MessageRecord messageRecord){
        receiveMessageRecord.add(messageRecord);
    }

    public void addSendMessageRecords(MessageRecord messageRecord){
        sendMessageRecord.add(messageRecord);
    }


    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }

    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }

    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }

    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }

    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }

    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }

    public ArrayList<MessageRecord> getSendMessageRecord() {
        return sendMessageRecord;
    }

    public ArrayList<MessageRecord> getReceiveMessageRecord() {
        return receiveMessageRecord;
    }
}


class MessageRecord extends CommunicationRecord{
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}


class User {
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;

    public void calBalance() {
        balance = 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;
    }
}


class Run {
    ArrayList<User> users = new ArrayList<>();

    public void play() {
        Scanner sc = new Scanner(System.in);
        String s;
        String[] a;
        User user;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        int pUserCoincide = 0;

        while (true) {
            s = sc.nextLine();
            if (s.equals("end")) break;
            if(s.length() < 5) continue;
            if(s.charAt(1) != '-'){
                continue;
            }
            
            if (s.charAt(0) == 'u') {//用户增加
                a = s.substring(2).split(" ");
//              if(a.length != 2) continue; 
                
                if(a[0].length() != 11 && a[0].length() != 12) continue;
                
                for(int i = 0; i < users.size(); i++){
                    if(a[0].equals(users.get(i).getNumber())){
                        pUserCoincide = 1;
                        continue;
                    }
                }
                if(pUserCoincide == 1){
                    pUserCoincide = 0 ;
                    continue;
                }
                
                user = new User();
                user.setNumber(a[0]);//设置号码
                //设置收费模式
                if (a[1].equals("0")) {
                    user.setChargeMode(new LandlinePhoneCharging());
                }

                users.add(user);
            } else if (s.charAt(0) == 't') {
                a = s.substring(2).split(" ");
                if(a.length != 6){
                    continue;
                }
                if((a[1].length() != 11 && a[1].length() != 12 && a[1].length() != 10) ||( a[0].length() != 11 && a[0].length() != 12 && a[0].length() != 10)){
                    continue;
                }
                
                
//                int pLandline = 0;//判断通话范围,1:市内 2:省内 3:国内
//                if(a[1].substring(0,4).matches("(079\\d)|(0701)")){
//                    if(a[1].substring(0,4).equals("0791")){
//                        pLandline = 1;
//                    } else {
//                        pLandline = 2;
//                    }
//                } else {
//                    pLandline = 3;
//                }

                CallRecord callRecord = new CallRecord();
                String tempS1 = a[2].concat(" ").concat(a[3]);
                String tempS2 = a[4].concat(" ").concat(a[5]);
                
                if(!isWrongFormat(tempS1) || !isWrongFormat(tempS2)){
                    continue;
                }

                try {
                    callRecord.setStartTime(simpleDateFormat.parse(tempS1));
                    callRecord.setEndTime(simpleDateFormat.parse(tempS2));
                } catch (ParseException e) {
                    continue;
                }
                callRecord.setCallingAddressAreaCode(a[0].substring(0, 4));
                callRecord.setAnswerAddressAreaCode(a[1].substring(0, 4));
                callRecord.setCallingNumber(a[0]);
                callRecord.setAnswerNumber(a[1]);
                
                if(callRecord.getStartTime().compareTo(callRecord.getEndTime()) >= 0){
                    continue;
                }

                for (int i = 0; i < users.size(); i++) {
                    if (callRecord.callingNumber.equals(users.get(i).getNumber())) {
                        if (callRecord.getAnswerAddressAreaCode().equals(callRecord.getCallingNumber().substring(0,4))) {
                            users.get(i).getUserRecords().addCallingCityRecords(callRecord);
                        } else if (callRecord.getAnswerAddressAreaCode().matches("(079\\d)|(0701)")) {
                            users.get(i).getUserRecords().addCallingInProvinceRecords(callRecord);
                        } else {
                            users.get(i).getUserRecords().addCallingInLandRecords(callRecord);
                        }
                    }
                    if (callRecord.answerNumber.equals(users.get(i).getNumber())) {
                        if (callRecord.getAnswerAddressAreaCode().equals("0791")) {
                            users.get(i).getUserRecords().addAnswerInCityRecords(callRecord);
                        } else if (callRecord.getAnswerAddressAreaCode().matches("(079\\d)|(0701)")) {
                            users.get(i).getUserRecords().addAnswerInProvinceRecords(callRecord);
                        } else {
                            users.get(i).getUserRecords().addAnswerInLandRecords(callRecord);
                        }
                    }
                }
            }
        }
        users.sort(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
//                return (int) (Double.parseDouble(o1.getNumber()) - Double.parseDouble(o2.getNumber()));
                return o1.getNumber().compareTo(o2.getNumber());
            }
        });
        for(int i = 0; i < users.size(); i++){
            users.get(i).calBalance();
            System.out.printf("%s %.1f %.1f\n",users.get(i).getNumber(),users.get(i).calCost(),users.get(i).getBalance());
//            System.out.println(users.get(i).getNumber()+" "+users.get(i).calCost()+" "+users.get(i).getBalance());
        }

    }
    
    public boolean isWrongFormat(String s){
        return s.matches("((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2-([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))-2-29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])");
    }
}




public class Main {
    public static void main(String[] args) {
        Run run = new Run();
        run.play();
    }
}

座机计费。本题已经给出了类图,代码主体只需要按照类图编写即可,题目留给我写的部分只剩下了Main函数这一部分,仅剩下的这一部分,也基本在考察不合要求的输入和年月日的正确判断上,题目已经给出了时间使用SimpleDateFormat这个类去判断,在花些时间简单了解SimpleDateFormat 类之后,题目只剩下了剩余部分的格式判断。题目所给类图中,计费功能和通话记录的分离的设计,继承与多态的灵活运用也值得学习。

二、手机+座机计费系列

手机+座机计费系列代码
import java.util.ArrayList;
import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;


class Run {
    ArrayList<User> users = new ArrayList<>();

    public void play() {
        Scanner sc = new Scanner(System.in);
        String s;
        String[] a;
        User user;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        simpleDateFormat.setLenient(false);
        int pUserCoincide = 0;

        while (true) {
            s = sc.nextLine();//读取一行
            if (s.equals("end")) break;//结束判断
            if(s.length() < 5) continue;//长度判断
            if(s.charAt(1) != '-'){
                continue;
            }

            //上面是格式判断,下面是情况执行
            if (s.charAt(0) == 'u') {//用户增加
                a = s.substring(2).split(" ");
                if(a.length != 2) continue;

                //长度判断
                if(a[1].equals("0"))
                {
                    if(!isLandPhoneNumber(a[0])) continue;
                } else if(a[1].equals("1")) {
                    if(!isCellNumber(a[0])) continue;
                }


                for(int i = 0; i < users.size(); i++){
                    if(a[0].equals(users.get(i).getNumber())){
                        pUserCoincide = 1;
                        continue;
                    }
                }
                if(pUserCoincide == 1){
                    pUserCoincide = 0 ;
                    continue;
                }

                user = new User();
                user.setNumber(a[0]);//设置号码
                //设置收费模式
                if (a[1].equals("0")) {
                    user.setChargeMode(new LandlinePhoneCharging());
                } else if(a[1].equals("1")){
                    user.setChargeMode(new CellPhoneCharging());
                }
                users.add(user);
            } else if (s.charAt(0) == 't') {
                a = s.substring(2).split(" +");
                if(a.length != 6 && a.length != 7 && a.length != 8){
                    continue;
                }
                CallRecord callRecord = new CallRecord();

                if(a.length == 6){
                    if(!isLandPhoneNumber(a[0]) || !isLandPhoneNumber(a[1])){
                        continue;
                    }
                    String tempS1 = a[2].concat(" ").concat(a[3]);
                    String tempS2 = a[4].concat(" ").concat(a[5]);

                    try {
                        callRecord.setStartTime(simpleDateFormat.parse(tempS1));
                        callRecord.setEndTime(simpleDateFormat.parse(tempS2));
                    } catch (ParseException e) {
                        continue;
                    }
                    callRecord.setCallingAddressAreaCode(a[0].substring(0, 4));
                    callRecord.setAnswerAddressAreaCode(a[1].substring(0, 4));
                    callRecord.setCallingNumber(a[0]);
                    callRecord.setAnswerNumber(a[1]);

                    if(callRecord.getStartTime().compareTo(callRecord.getEndTime()) >= 0){
                        continue;
                    }
                } else if(a.length == 7){
                    if(a[1].length() <= 4){
                        if(!isLandPhoneNumber(a[2]) || !isCellNumber(a[0]) || !isAreaCode(a[1])){
                            continue;
                        }

                        String tempS1 = a[3].concat(" ").concat(a[4]);
                        String tempS2 = a[5].concat(" ").concat(a[6]);

                        try {
                            callRecord.setStartTime(simpleDateFormat.parse(tempS1));
                            callRecord.setEndTime(simpleDateFormat.parse(tempS2));
                        } catch (ParseException e) {
                            continue;
                        }
                        callRecord.setCallingAddressAreaCode(a[1]);
                        callRecord.setAnswerAddressAreaCode(a[2].substring(0, 4));
                        callRecord.setCallingNumber(a[0]);
                        callRecord.setAnswerNumber(a[2]);
                    } else if(a[2].length() <= 4){
                        if(!isLandPhoneNumber(a[0]) || !isCellNumber(a[1]) || !isAreaCode(a[2])){
                            continue;
                        }
                        String tempS1 = a[3].concat(" ").concat(a[4]);
                        String tempS2 = a[5].concat(" ").concat(a[6]);

                        try {
                            callRecord.setStartTime(simpleDateFormat.parse(tempS1));
                            callRecord.setEndTime(simpleDateFormat.parse(tempS2));
                        } catch (ParseException e) {
                            continue;
                        }
                        callRecord.setCallingAddressAreaCode(a[0].substring(0, 4));
                        callRecord.setAnswerAddressAreaCode(a[2]);
                        callRecord.setCallingNumber(a[0]);
                        callRecord.setAnswerNumber(a[1]);
                    }
                    if(callRecord.getCallingNumber().equals(callRecord.getAnswerNumber()))continue;

                } else if(a.length == 8){
//                     if(!s.matches("t-1\\d{10} 0\\d{2,3} 1\\d{10} 0\\d{2,3} \\d{4}.\\d{1,2}.\\d{1,2} \\d{2}:\\d{2}:\\d{2} \\d{4}.\\d{1,2}.\\d{1,2} \\d{2}:\\d{2}:\\d{2}")){
//                         continue;
//                     }
                    if(!a[4].matches("\\d{4}\\.\\d{1,2}\\.\\d{1,2}")  ){
                        continue;
                    }
//                     if(!a[5].matches("\\d{2}:\\d{2}:\\d{2}")){
//                         continue;
//                     }
//                     if(!a[6].matches("\\d{4}\\.\\d{1,2}\\.\\d{1,2}") || !a[7].matches("\\d{2}:\\d{2}:\\d{2}")){
//                         continue;
//                     }
                    
                    if(!isCellNumber(a[0]) || !isCellNumber(a[2]) || !isAreaCode(a[1]) || !isAreaCode(a[3])){
                        continue;
                    }
                    String tempS1 = a[4].concat(" ").concat(a[5]);
                    String tempS2 = a[6].concat(" ").concat(a[7]);

                    try {
                        callRecord.setStartTime(simpleDateFormat.parse(tempS1));
                        callRecord.setEndTime(simpleDateFormat.parse(tempS2));
                    } catch (ParseException e) {
                        continue;
                    }
                    callRecord.setCallingAddressAreaCode(a[1]);
                    callRecord.setAnswerAddressAreaCode(a[3]);
                    callRecord.setCallingNumber(a[0]);
                    callRecord.setAnswerNumber(a[2]);
                }
               if(callRecord.getStartTime().compareTo(callRecord.getEndTime()) >= 0){
                   continue;
               }


                for (int i = 0; i < users.size(); i++) {
                    if (callRecord.callingNumber.equals(users.get(i).getNumber())) {
                        if(users.get(i).getChargeMode() instanceof LandlinePhoneCharging)
                        {
                            if (callRecord.getAnswerAddressAreaCode().equals("0791")) {
                                users.get(i).getUserRecords().addCallingCityRecords(callRecord);
                            } else if (callRecord.getAnswerAddressAreaCode().matches("(079\\d)|(0701)")) {
                                users.get(i).getUserRecords().addCallingInProvinceRecords(callRecord);
                            } else {
                                users.get(i).getUserRecords().addCallingInLandRecords(callRecord);
                            }
                        } else {
                            if (callRecord.getCallingAddressAreaCode().equals("0791") ) {
                                users.get(i).getUserRecords().addCallingCityRecords(callRecord);
                            } else if (callRecord.getCallingAddressAreaCode().matches("(079\\d)|(0701)") ) {
                                users.get(i).getUserRecords().addCallingInProvinceRecords(callRecord);
                            } else {
                                users.get(i).getUserRecords().addCallingInLandRecords(callRecord);
                            }
                        }


                    }
                    if (callRecord.answerNumber.equals(users.get(i).getNumber())) {
                        if (callRecord.getAnswerAddressAreaCode().equals("0791")) {
                            users.get(i).getUserRecords().addAnswerInCityRecords(callRecord);
                        } else if (callRecord.getAnswerAddressAreaCode().matches("(079\\d)|(0701)")) {
                            users.get(i).getUserRecords().addAnswerInProvinceRecords(callRecord);
                        } else {
                            users.get(i).getUserRecords().addAnswerInLandRecords(callRecord);
                        }
                    }
                }
            }
        }
        users.sort(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
//                return (int) (Double.parseDouble(o1.getNumber()) - Double.parseDouble(o2.getNumber()));
                return o1.getNumber().compareTo(o2.getNumber());
            }
        });
//        System.out.println("----");
        for(int i = 0; i < users.size(); i++){
            users.get(i).calBalance();
           System.out.println(users.get(i).getNumber()+" "+new DecimalFormat("0.0#").format(users.get(i).calCost())+" "+new DecimalFormat("0.0#").format(users.get(i).getBalance()));
//             System.out.printf("%s %.1f %.1f\n",users.get(i).getNumber(),users.get(i).calCost(),users.get(i).getBalance());
//            System.out.println(users.get(i).getNumber()+" "+users.get(i).calCost()+" "+users.get(i).getBalance());
        }

    }

    public boolean isLandPhoneNumber(String s){
        return s.matches("0\\d{9,11}");
    }

    public boolean isCellNumber(String s){
//        return s.matches("^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}");
        return s.matches("1\\d{10}");
    }

    public boolean isAreaCode(String s){
        return s.matches("0\\d{2,3}");
    }
}





public class Main {
    public static void main(String[] args) {
        Run run = new Run();
        run.play();
    }
}

class UserRecords {
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<>();
    private ArrayList<MessageRecord> sendMessageRecord = new ArrayList<>();
    private ArrayList<MessageRecord> receiveMessageRecord = new ArrayList<>();

    public void addCallingCityRecords(CallRecord callRecord){
        callingInCityRecords.add(callRecord);
    }

    public void addCallingInProvinceRecords(CallRecord callRecord){
        callingInProvinceRecords.add(callRecord);
    }

    public void addCallingInLandRecords(CallRecord callRecord){
        callingInLandRecords.add(callRecord);
    }

    public void addAnswerInCityRecords(CallRecord callRecord){
        answerInCityRecords.add(callRecord);
    }

    public void addAnswerInProvinceRecords(CallRecord callRecord){
        answerInProvinceRecords.add(callRecord);
    }

    public void addAnswerInLandRecords(CallRecord callRecord){
        answerInLandRecords.add(callRecord);
    }

    public void addReceiveMessageRecords(MessageRecord messageRecord){
        receiveMessageRecord.add(messageRecord);
    }

    public void addSendMessageRecords(MessageRecord messageRecord){
        sendMessageRecord.add(messageRecord);
    }


    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }

    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }

    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }

    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }

    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }

    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }

    public ArrayList<MessageRecord> getSendMessageRecord() {
        return sendMessageRecord;
    }

    public ArrayList<MessageRecord> getReceiveMessageRecord() {
        return receiveMessageRecord;
    }
}


class User {
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;

    public void calBalance() {
        balance = 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;
    }
}


class MessageRecord extends CommunicationRecord{
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}

class LandPhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.6;
        }
        return cost;
    }
}


class LandPhoneInCityRule extends CallChargeRule{


    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.1;
        }
        return cost;
    }
}


class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;

    public LandlinePhoneCharging(){
        getChargeRules().add(new LandPhoneInCityRule());
        getChargeRules().add(new LandPhoneInProvinceRule());
        getChargeRules().add(new LandPhoneInLandRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = cost + ((LandPhoneInCityRule)getChargeRules().get(0)).calCost(userRecords.getCallingInCityRecords());
        cost = cost + ((LandPhoneInProvinceRule)getChargeRules().get(1)).calCost(userRecords.getCallingInProvinceRecords());
        cost = cost + ((LandPhoneInLandRule)getChargeRules().get(2)).calCost(userRecords.getCallingInLandRecords());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}

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;
    }
}

abstract class ChargeRule {
}


abstract class ChargeMode {
    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }

    public abstract double calCost(UserRecords userRecords);

    public abstract double getMonthlyRent();
}


class CellPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}


class CellPhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.6;
        }
        return cost;
    }

    public double calAnswerCost(ArrayList<CallRecord> callRecords){
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}


class CellPhoneInCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            //判断拨打的位置,分别计费
            if(callRecords.get(i).getAnswerAddressAreaCode().equals("0791")){
                cost = cost + interval*0.1;
            } else if(callRecords.get(i).getAnswerAddressAreaCode().matches("079\\d|0701")){
                cost = cost + interval*0.2;
            } else {
                cost = cost + interval*0.3;
            }

        }
        return cost;
    }
}


class CellPhoneCharging extends ChargeMode{
    double monthlyRent = 15;

    public CellPhoneCharging(){
        getChargeRules().add(new CellPhoneInCityRule());
        getChargeRules().add(new CellPhoneInProvinceRule());
        getChargeRules().add(new CellPhoneInLandRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = cost + ((CellPhoneInCityRule)getChargeRules().get(0)).calCost(userRecords.getCallingInCityRecords());
        cost = cost + ((CellPhoneInProvinceRule)getChargeRules().get(1)).calCost(userRecords.getCallingInProvinceRecords());
        cost = cost + ((CellPhoneInLandRule)getChargeRules().get(2)).calCost(userRecords.getCallingInLandRecords());
        cost = cost + ((CellPhoneInLandRule)getChargeRules().get(2)).calAnswerCost(userRecords.getAnswerInLandRecords());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}


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;
    }
}


abstract class CallChargeRule extends ChargeRule{

    public abstract double calCost(ArrayList<CallRecord> callRecords);
}

 

第二题与第一题相比,类图上唯一的区别是在抽象计费规则类CallChargeRule下多写了几个手机收费的子类。主要的考察还是集中在无效输入上。

三、短信计费

短信计费代码

import java.util.ArrayList;
import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;


class Run {
    ArrayList<User> users = new ArrayList<>();

    public void play() {
        Scanner sc = new Scanner(System.in);
        String s;
        String[] a;
        User user;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        simpleDateFormat.setLenient(false);
        int pUserCoincide = 0;

        while (true) {
            s = sc.nextLine();//读取一行
            if (s.equals("end")) break;//结束判断
            if(s.length() < 2) continue;//长度判断
            if(s.charAt(1) != '-'){
                continue;
            }

            //上面是格式判断,下面是情况执行
            if (s.charAt(0) == 'u') {//用户增加
                a = s.substring(2).split(" ");
                if(a.length != 2) continue;

                //长度判断
                if(a[1].equals("0"))
                {
                    if(!isLandPhoneNumber(a[0])) continue;
                } else if(a[1].equals("1")) {
                    if(!isCellNumber(a[0])) continue;
                } else if(a[1].equals("3")) {
                    if(!isCellNumber(a[0])) continue;
                }


                for(int i = 0; i < users.size(); i++){
                    if(a[0].equals(users.get(i).getNumber())){
                        pUserCoincide = 1;
                        continue;
                    }
                }
                if(pUserCoincide == 1){
                    pUserCoincide = 0 ;
                    continue;
                }

                user = new User();
                user.setNumber(a[0]);//设置号码
                //设置收费模式
                if (a[1].equals("0")) {

                } else if(a[1].equals("1")){

                } else if(a[1].equals("3")){
                    user.setChargeMode(new MessageCharging());
                }
                users.add(user);
            } else if (s.charAt(0) == 't') {

               
            } else if(s.charAt(0) == 'm'){
                a = s.substring(2).split(" ");
                MessageRecord messageRecord = new MessageRecord();
                if(s.matches("m-1\\d{10} 1\\d{10} (\\d|\\w| |,|\\.)+")){
                    messageRecord.setMessage(s.substring(s.indexOf(' ',s.indexOf(' ')+1)+1));
                } else{
                    continue;
                }
                for(int i = 0; i < users.size();i++){
                    if(a[0].equals(users.get(i).getNumber())){
                        users.get(i).getUserRecords().addSendMessageRecords(messageRecord);
                    }
                }
                for(int i = 0; i < users.size(); i++){
                    if(a[1].equals(users.get(i).getNumber())){
                        users.get(i).getUserRecords().addReceiveMessageRecords(messageRecord);
                    }
                }
            }
        }
        users.sort(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
//                return (int) (Double.parseDouble(o1.getNumber()) - Double.parseDouble(o2.getNumber()));
                return o1.getNumber().compareTo(o2.getNumber());
            }
        });
//        System.out.println("----");
        for(int i = 0; i < users.size(); i++){
            users.get(i).calBalance();
//            System.out.println(users.get(i).getNumber()+" "+new DecimalFormat("#.##").format(users.get(i).calCost())+" "+new DecimalFormat("#.##").format(users.get(i).getBalance()));
            System.out.printf("%s %.1f %.1f\n",users.get(i).getNumber(),users.get(i).calCost(),users.get(i).getBalance());
//            System.out.println(users.get(i).getNumber()+" "+users.get(i).calCost()+" "+users.get(i).getBalance());
        }

    }

    public boolean isLandPhoneNumber(String s){
        return s.matches("0(\\d{9}|\\d{10}|\\d{11})");
    }

    public boolean isCellNumber(String s){
//        return s.matches("^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}");
        return s.matches("1\\d{10}");
    }

    public boolean isAreaCode(String s){
        return s.matches("0\\d{2,3}");
    }
}


abstract class MessageChargeRule extends ChargeRule{
    public abstract double calCost(ArrayList<MessageRecord> callRecords);

}

class MessageRule extends MessageChargeRule{

    @Override
    public double calCost(ArrayList<MessageRecord> messageRecords) {
        double cost = 0;
        int amount = 0;
        for(int i = 0; i < messageRecords.size(); i++){
            if(messageRecords.get(i).getMessage().length() % 10 == 0){
                amount = amount + messageRecords.get(i).getMessage().length() / 10;
            } else {
                amount = amount + messageRecords.get(i).getMessage().length() / 10 + 1;
            }
        }
        if(amount <= 3){
            cost = amount * 0.1;
        } else if(amount <= 5){
            cost = 3 * 0.1 + (amount-3) * 0.2;
        } else {
            cost = 3 * 0.1 + 2 * 0.2 + (amount - 5) * 0.3;
        }

        return cost;
    }
}

class MessageCharging extends ChargeMode{
    double monthlyRent = 0;

    public MessageCharging(){
        getChargeRules().add(new MessageRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = ((MessageRule)getChargeRules().get(0)).calCost(userRecords.getSendMessageRecord());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}






public class Main {
    public static void main(String[] args) {
        Run run = new Run();
        run.play();
    }
}

class UserRecords {
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<>();
    private ArrayList<MessageRecord> sendMessageRecord = new ArrayList<>();
    private ArrayList<MessageRecord> receiveMessageRecord = new ArrayList<>();

    public void addCallingCityRecords(CallRecord callRecord){
        callingInCityRecords.add(callRecord);
    }

    public void addCallingInProvinceRecords(CallRecord callRecord){
        callingInProvinceRecords.add(callRecord);
    }

    public void addCallingInLandRecords(CallRecord callRecord){
        callingInLandRecords.add(callRecord);
    }

    public void addAnswerInCityRecords(CallRecord callRecord){
        answerInCityRecords.add(callRecord);
    }

    public void addAnswerInProvinceRecords(CallRecord callRecord){
        answerInProvinceRecords.add(callRecord);
    }

    public void addAnswerInLandRecords(CallRecord callRecord){
        answerInLandRecords.add(callRecord);
    }

    public void addReceiveMessageRecords(MessageRecord messageRecord){
        receiveMessageRecord.add(messageRecord);
    }

    public void addSendMessageRecords(MessageRecord messageRecord){
        sendMessageRecord.add(messageRecord);
    }


    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }

    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }

    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }

    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }

    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }

    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }

    public ArrayList<MessageRecord> getSendMessageRecord() {
        return sendMessageRecord;
    }

    public ArrayList<MessageRecord> getReceiveMessageRecord() {
        return receiveMessageRecord;
    }
}


class User {
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;

    public void calBalance() {
        balance = 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;
    }
}


class MessageRecord extends CommunicationRecord{
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}

class LandPhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.6;
        }
        return cost;
    }
}


class LandPhoneInCityRule extends CallChargeRule{


    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.1;
        }
        return cost;
    }
}


class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;

    public LandlinePhoneCharging(){
        getChargeRules().add(new LandPhoneInCityRule());
        getChargeRules().add(new LandPhoneInProvinceRule());
        getChargeRules().add(new LandPhoneInLandRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = cost + ((LandPhoneInCityRule)getChargeRules().get(0)).calCost(userRecords.getCallingInCityRecords());
        cost = cost + ((LandPhoneInProvinceRule)getChargeRules().get(1)).calCost(userRecords.getCallingInProvinceRecords());
        cost = cost + ((LandPhoneInLandRule)getChargeRules().get(2)).calCost(userRecords.getCallingInLandRecords());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}

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;
    }
}

abstract class ChargeRule {
}


abstract class ChargeMode {
    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();

    public ArrayList<ChargeRule> getChargeRules() {
        return chargeRules;
    }

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }

    public abstract double calCost(UserRecords userRecords);

    public abstract double getMonthlyRent();
}


class CellPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}


class CellPhoneInLandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.6;
        }
        return cost;
    }

    public double calAnswerCost(ArrayList<CallRecord> callRecords){
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            cost = cost + interval*0.3;
        }
        return cost;
    }
}


class CellPhoneInCityRule extends CallChargeRule{

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        long interval;
        double cost = 0;
        for(int i = 0; i < callRecords.size(); i++){
            interval = callRecords.get(i).getEndTime().getTime() - callRecords.get(i).getStartTime().getTime();
            if(interval % 60000 == 0){
                interval = interval / 60000;
            } else {
                interval = interval / 60000 +1;
            }
            //判断拨打的位置,分别计费
            if(callRecords.get(i).getAnswerAddressAreaCode().equals("0791")){
                cost = cost + interval*0.1;
            } else if(callRecords.get(i).getAnswerAddressAreaCode().matches("079\\d|0701")){
                cost = cost + interval*0.2;
            } else {
                cost = cost + interval*0.3;
            }

        }
        return cost;
    }
}


class CellPhoneCharging extends ChargeMode{
    double monthlyRent = 15;

    public CellPhoneCharging(){
        getChargeRules().add(new CellPhoneInCityRule());
        getChargeRules().add(new CellPhoneInProvinceRule());
        getChargeRules().add(new CellPhoneInLandRule());
    }

    @Override
    public double calCost(UserRecords userRecords) {
        double cost = 0;
        cost = cost + ((CellPhoneInCityRule)getChargeRules().get(0)).calCost(userRecords.getCallingInCityRecords());
        cost = cost + ((CellPhoneInProvinceRule)getChargeRules().get(1)).calCost(userRecords.getCallingInProvinceRecords());
        cost = cost + ((CellPhoneInLandRule)getChargeRules().get(2)).calCost(userRecords.getCallingInLandRecords());
        cost = cost + ((CellPhoneInLandRule)getChargeRules().get(2)).calAnswerCost(userRecords.getAnswerInLandRecords());
        return cost;
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}


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;
    }
}


abstract class CallChargeRule extends ChargeRule{

    public abstract double calCost(ArrayList<CallRecord> callRecords);
}

有了之前两次的总结,本次相较前两次还更简单的练习完成得比较顺利。在类设计上模仿手机和座机计费规则类写了短信的计费类。使用正则表达式进行输入无效的判断,这次练习进行地比较顺利。

 

踩坑心得

  这三次电信计费练习涉及了许多输入有效性的判断。也卡了较长时间。在第一题时,比较专注于时间输入有效性的判断,对SimpleDateFormat类的不了解也导致第一题使用了错误的方法判断的时间,对其余部分的格式判断也简单判断,没有使用正则表达式判断,导致座机计费格式判断并不全面。在手机+座机计费这一题时,在学会使用SimpleDateFormat类进行时间判断后,由于第一题对通话记录的判断集中于号码位数的判断,未对号码字符是否是数字进行判断导致花费了很多时间,最终使用正则表达式进行了前面的号码的判断之后还剩余两分没有获得,反复尝试后发现是时间输入格式不符合导致的,不了解什么样的输入可以被SimpleDateFormat转化却不符合yyyy.MM.dd HH:mm:ss。第三次短信收费计算的时候有了前两次的总结,写的时候就比较顺利了。

 

总结

在第12~15周这一阶段中,题目的难度相比上一阶段简单了很多。在这一阶段教学课程大部分集中于告诉我们合理类设计的重要性,我对于这一点的体会逐渐加深,课堂上的设计原则值得去了解。

标签:return,get,ArrayList,interval,Blog,cost,计费,电信,public
来源: https://www.cnblogs.com/huan2021/p/16383708.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有