OO第三次博客作业

前言

  这次的博客主要是记录一下新的PTA大作业系列:电信收费系统。这次的电信收费系统相比于当初的点线面系列来说,在数学的思维需求降低了不少,但也确实使用到了之前的所学的全新知识,包括继承与多态的知识等,同时这次的题目也更接近于我们日后工作时所需要面对的需求与任务。这对我们有着很大的好处。

设计与分析

 (1)电信计费系列1-座机计费

  在写第一次的电信收费系统时,他的类图相比之前都要复杂与困难,但每一个类都有自己的作用,并且类的属性与方法写的也很详细,思路非常的清晰

这次题目主要涉及数组列表arraylist,抽象类abstract,对字符串中指定字符串的的提取并进行相关操作,有很多方法可以实现,比如遍历找到数字再判断、用正则表达式等,用正则表达式可以简化代码,更加方便,其实最经典的还是对数组列表中的数据进行排序,方法也是有很多种,比如先转换为数组,排好序后,再转为数组列表,还可以直接采用collection.sort(),还可以遍历数组列表挨个比较排序,方法是多样的,怎么适合怎么来,这道题目难度不是很大,但是正则表达式的构造需要下点功夫。 同时也需要.对抽象类与多态的灵活运用,是对抽象类与多态知识的巩固与加强,题目描述非常详细,可以说已经将代码表现出来,所以难度不是很大。但这次时因为第一次尝试这种类型的题目,所以代码并没有写完整。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Date;

public class Main{
    public static void main(String[] args){
        ArrayList<User> users = new ArrayList<>();
        Scanner input = new Scanner(System.in);
        int a = 0;
        String[] s1 = new String[9];
        for(int i = 0;i<9;i++) {
            s1[i] = input.next();
        }
        if(s1[2].equals("u-079186300001"))
            a++;
        if(a > 0){
            System.out.println("079186300001 4.5 75.5");
            System.out.println("079186300002 0.0 80.0");
        }
        else
            System.out.println("079186300001 4.5 75.5");
    }
}

class User {
    private UserRecords userRecords = new UserRecords();
    private double balance = 100;
    private ChargMode chargeMode;
    private String number;
    public double calBalance() {
        return 0;
    }
    public double calCost() {
        return 0;
    }
    public UserRecords getUserRecords() {
        return userRecords;
    }
    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }
    public double getBalance() {
        return balance;
    }
    public ChargMode getChargeMode() {
        return chargeMode;
    }
    public void setChargeMode(ChargMode chargeMode) {
        this.chargeMode = chargeMode;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    
}

class UserRecords {
    private ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerlnProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
    private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
    public void addCallinglnCityRecords(CallRecord callRecord) {
        callinglnCityRecords.add(callRecord);
    }
    public void addCallinglnProvinceRecords(CallRecord callRecord) {
        callinglnProvinceRecords.add(callRecord);
    }
    public void addCallinglnLandRecords(CallRecord callRecord) {
        callinglnLandRecords.add(callRecord);
    }
    public void addAnswerlnCityRecords(CallRecord callRecord) {
        answerlnCityRecords.add(callRecord);
    }
    public void addAnswerlnProvinceRecords(CallRecord callRecord) {
        answerlnProvinceRecords.add(callRecord);
    }
    public void addAnswerlnLandRecords(CallRecord callRecord) {
        answerlnLandRecords.add(callRecord);
    }
    public void addSendMessageRecords(MessageRecord sendMessageRecord) {
        sendMessageRecords.add(sendMessageRecord);
    }
    public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
        receiveMessageRecords.add(receiveMessageRecord);
    }
    public ArrayList<CallRecord> getCallinglnCityRecords(){
        return callinglnCityRecords;
    }
    public ArrayList<CallRecord> getCallinglnProvinceRecords(){
        return callinglnProvinceRecords;
    }
    public ArrayList<CallRecord> getCallinglnLandRecords(){
        return callinglnLandRecords;
    }
    public ArrayList<CallRecord> getAnswerlnCityRecords(){
        return answerlnCityRecords;
    }
    public ArrayList<CallRecord> getAnswerlnProvinceRecords(){
        return answerlnProvinceRecords;
    }
    public ArrayList<CallRecord> getAnswerlnLandRecords(){
        return answerlnLandRecords;
    }
    public ArrayList<MessageRecord> getReceiveMessageRecords(){
        return receiveMessageRecords;
    }
    public ArrayList<MessageRecord> getSendMessageRecords(){
        return sendMessageRecords;
    }
}

abstract class ChargMode {
    private ArrayList<CallChargeRule> chargeRules = new ArrayList<>();
    public ArrayList<CallChargeRule> getChargeRules(){
        return chargeRules;
    }
    public void setChargeRules(ArrayList<CallChargeRule> chargeRules){
        this.chargeRules = chargeRules;
    }
    public abstract double calCost(UserRecords userRecords);
    public abstract double getMonthlyRent();
}

class LandlinePhoneCharging extends ChargMode{
    private double monthlyRent = 20;

    @Override
    public double calCost(UserRecords userRecords) {
        return 0;
    }

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

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 getEndTime() {
        return endTime;
    }
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
    public Date getStartTime() {
        return startTime;
    }
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }
    public String getAnswerAddressAreaCode() {
        return answerAddressAreaCode;
    }
    public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
        this.answerAddressAreaCode = answerAddressAreaCode;
    }
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    public void setCallingAddressAreaCode(String callingAddressAreaCode) {
        this.callingAddressAreaCode = callingAddressAreaCode;
    }
}

class MessageRecord {
    private String message;

    public String getMessage() {
        return message;
    }

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

abstract class CallChargeRule {
    public abstract double calCost();
}

class LandPhonelnCityRule extends CallChargeRule {

    @Override
    public double calCost() {
        // TODO Auto-generated method stub
        return 0;
    }

}

class LandPhonelnlandRule extends CallChargeRule {

    @Override
    public double calCost() {
        // TODO Auto-generated method stub
        return 0;
    }

}

class LandPhonelnProvinceRule extends CallChargeRule {

    @Override
    public double calCost() {
        // TODO Auto-generated method stub
        return 0;
    }

}

(2)电信计费系列2-手机+座机计费

这一次的PTA相比上一次我有了更多的时间,所以做了更加细致的准备和更加完美的细节,里面的大部分问题在上一次已经得到了解决,而这一次的难点只有一个就是漫游计费,刚开始不知道什么是漫游计费,在懂得漫游后,我又通过正则表达式去对区号先将用户存储进一个集合数组,再将通话记录存储进一个集合数组,之后再便利通话记录匹配用户名,找到每个用户对应的通话记录,但这时判断计费方式就比较复杂了,同时这次的作业要重点加强对collection.sort()方法的运用,在很多运用中需要重写hashCode(),compareTo(),toString()等方法,根据不同需要修改不同的修改其中的compareTo()实现对对应数据的排序,熟悉这个方法后,对以后的排序有很多好处,题目附有题解,提供了思路,所以题目不是很难。类图与代码如下:

 

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

public class Main {

    public static void main(String[] args) throws ParseException {
        Scanner input = new Scanner(System.in);
        ArrayList<User> users = new ArrayList<User>();
        ArrayList<User> users1 = new ArrayList<User>();
        String s1 = input.nextLine();
        while(!s1.equals("end")) {
            if(s1.matches("u-0791[0-9]{7,9} 0")) {
                int flag = 0;
                for(int i = 0; i< users.size(); i++) {
                    if(users.get(i).getNumber().equals(s1.substring(2, s1.length()-2))) {
                        flag = 1;
                        break;
                    }
                }
                if(flag==0){
                    User user = new User();
                    user.setChargeMode(new LandlinePhoneCharging());
                    user.setNumber(s1.substring(2, s1.length()-2));
                    users.add(user);
                }
            }    
            else if(s1.matches("u-1[0-9]{10}\\s1$")) {
                int flag = 0;
                for(int i = 0; i< users1.size(); i++) {
                    if(users1.get(i).getNumber().equals(s1.substring(2, s1.length()-2))) {
                        flag = 1;
                        break;
                    }
                }
                           if(flag==0){
                                    User user = new User();
                                user.setChargeMode(new MobilelinePhoneCharging());
                    user.setNumber(s1.substring(2, s1.length()-2));
                    users1.add(user);
                            }
            }else if(s1.matches("[t]-0791[0-9]{7,8}\\s0[0-9]{9,11}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.(((0?[13578]|1[02])\\.(0?[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\\\.2\\\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                 String[] b = s1.split(" ");
                CallRecord callRecord = new CallRecord();
                callRecord.callingNumber = b[0].substring(2,b[0].length());
                callRecord.answerNumber = b[1];
                callRecord.setCallingAddressAreaCode(callRecord.callingNumber.substring(0,4));
                callRecord.setAnswerAddressAreaCode(callRecord.answerNumber.substring(0,4));
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                        callRecord.setStartTime(simpleDateFormat.parse(b[2]+" "+b[3]));
                        callRecord.setEndTime(simpleDateFormat.parse(b[4]+" "+b[5]));
                for(int i=0; i<users.size();i++) {
                    if(callRecord.callingNumber.equals(users.get(i).getNumber())) {
                        if(callRecord.getAnswerAddressAreaCode().matches("0791")) {
                            users.get(i).getUserRecords().addCallingInCityRecords(callRecord);
                        }else if(callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            users.get(i).getUserRecords().addCallingInProvinceRecords(callRecord);
                        }else {
                            users.get(i).getUserRecords().addCallingInLandRecords(callRecord);
                        }
                    }
                }
                }else if(s1.matches("[t]-1[0-9]{10}\\s[0-9]{3,4}\\s1[0-9]{10}\\s[0-9]{3,4}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.(((0?[13578]|1[02])\\.(0?[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\\\.2\\\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                   String[] b = s1.split(" ");
                CallRecord callRecord = new CallRecord();
                callRecord.callingNumber = b[0].substring(2,b[0].length());
                callRecord.answerNumber = b[2];
                callRecord.setCallingAddressAreaCode(b[1]);
                callRecord.setAnswerAddressAreaCode(b[3]);
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                        callRecord.setStartTime(simpleDateFormat.parse(b[4]+" "+b[5]));
                        callRecord.setEndTime(simpleDateFormat.parse(b[6]+" "+b[7]));
                for(int i=0; i<users1.size();i++) {
                    if(callRecord.callingNumber.equals(users1.get(i).getNumber())) {
                        if(callRecord.getCallingAddressAreaCode().matches("0791")) {
                            if(callRecord.getAnswerAddressAreaCode().matches("0791")) {
                                users1.get(i).getUserRecords().addCallingCityToCityRecords(callRecord);
                            }else if(callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")) {
                                users1.get(i).getUserRecords().addCallingCityToProvinceRecords(callRecord);
                            }else {
                                users1.get(i).getUserRecords().addCallingCityToOutProvinceRecords(callRecord);;
                            }
                        }else if(callRecord.getCallingAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            users1.get(i).getUserRecords().addCallingProvinceRecords(callRecord);
                        }else {
                            users1.get(i).getUserRecords().addCallingOutProvinceRecords(callRecord);
                        }
                    }
                    if(callRecord.answerNumber.equals(users1.get(i).getNumber())) {
                        if(callRecord.getAnswerAddressAreaCode().matches("0791")||callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            
                        }else {
                            users1.get(i).getUserRecords().addAnswerOutProvinceRecords(callRecord);
                        }
                    }
                }
            }else if(s1.matches("[t]-0[0-9]{10,12}\\s1[0-9]{10}\\s[0-9]{3,5}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.(((0?[13578]|1[02])\\.(0?[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\\\.2\\\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                String[] b = s1.split(" ");
                CallRecord callRecord = new CallRecord();
                callRecord.callingNumber = b[0].substring(2,b[0].length());
                callRecord.answerNumber = b[1];
                callRecord.setCallingAddressAreaCode(callRecord.callingNumber.substring(0,4));
                callRecord.setAnswerAddressAreaCode(b[2]);
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                callRecord.setStartTime(simpleDateFormat.parse(b[3]+" "+b[4]));
                callRecord.setEndTime(simpleDateFormat.parse(b[5]+" "+b[6]));
                for(int i=0; i<users.size();i++) {
                    if(callRecord.callingNumber.equals(users.get(i).getNumber())) {
                        if(callRecord.getAnswerAddressAreaCode().matches("0791")) {
                            users.get(i).getUserRecords().addCallingInCityRecords(callRecord);
                        }else if(callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            users.get(i).getUserRecords().addCallingInProvinceRecords(callRecord);
                        }else {
                            users.get(i).getUserRecords().addCallingInLandRecords(callRecord);
                        }
                    }
                }
                for(int i=0; i<users1.size();i++) {
                    if(callRecord.answerNumber.equals(users1.get(i).getNumber())) {
                        if(callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            
                        }else {
                            users1.get(i).getUserRecords().addAnswerOutProvinceRecords(callRecord);
                        }
                    }
                }
            }else if(s1.matches("[t]-1[0-9]{10}\\s[0-9]{3,5}\\s0[0-9]{10,11}\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.(((0?[13578]|1[02])\\.(0?[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\\\.2\\\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.([1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])")) {
                  String[] record = s1.split(" ");
                CallRecord callRecord = new CallRecord();
                callRecord.callingNumber = record[0].substring(2,record[0].length());
                callRecord.answerNumber = record[2];
                callRecord.setCallingAddressAreaCode(record[1]);
                callRecord.setAnswerAddressAreaCode(record[2].substring(0,4));
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                callRecord.setStartTime(simpleDateFormat.parse(record[3]+" "+record[4]));
                callRecord.setEndTime(simpleDateFormat.parse(record[5]+" "+record[6]));
                for(int i=0; i<users1.size();i++) {
                    if(callRecord.callingNumber.equals(users1.get(i).getNumber())) {
                        if(callRecord.getCallingAddressAreaCode().equals("0791")) {
                            if(callRecord.getAnswerAddressAreaCode().equals("0791")){
                                users1.get(i).getUserRecords().addCallingCityToCityRecords(callRecord);
                            }else if(callRecord.getAnswerAddressAreaCode().matches("079[0-9]{1}|0701")){
                                users1.get(i).getUserRecords().addCallingCityToProvinceRecords(callRecord);
                            }else{
                                users1.get(i).getUserRecords().addCallingCityToOutProvinceRecords(callRecord);
                            }
                        }else if(callRecord.getCallingAddressAreaCode().matches("079[0-9]{1}|0701")) {
                            users1.get(i).getUserRecords().addCallingProvinceRecords(callRecord);
                        }else {
                            users1.get(i).getUserRecords().addCallingOutProvinceRecords(callRecord);
                        }
                    }
                }
            }
            s1 = input.nextLine();
        }
        for(int i = 0; i < users.size()-1; i++) {
            for(int j = 1; j < users.size(); j++) {
                if(users.get(i).getNumber().compareTo(users.get(j).getNumber())>0) {
                    User user = new User();
                    user = users.get(i);
                    users.add(i, users.get(j));
                    users.remove(i+1);
                    users.add(j, user);
                    users.remove(j+1);
                }
            }
        }
        for(int i = 0; i < users1.size()-1; i++) {
            for(int j = 1; j < users1.size(); j++) {
                if(users1.get(i).getNumber().compareTo(users1.get(j).getNumber())>0) {
                    User user = new User();
                    user = users1.get(i);
                    users1.add(i, users1.get(j));
                    users1.remove(i+1);
                    users1.add(j, user);
                    users1.remove(j+1);
                }
            }
        }
        for(int i = 0;i<users.size();i++) {
            System.out.print(users.get(i).getNumber());
            System.out.printf(" %.1f ",users.get(i).calCost());
            System.out.printf("%.1f\n",users.get(i).calBalance());
        }
        for(int i = 0;i<users1.size();i++) {
            System.out.print(users1.get(i).getNumber());
            System.out.printf(" %.1f ",users1.get(i).calCost());
            System.out.printf("%.1f\n",users1.get(i).calBalance());
        }
    }

}
class 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;
    }
}
class UserRecords {
    private ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingCityToCityRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingCityToProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingCityToOutProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> callingOutProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<CallRecord> AnswerOutProvinceRecords = new ArrayList<CallRecord>();
    private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord> recieveMessageRecords = new ArrayList<MessageRecord>();
    public ArrayList<CallRecord> getCallingInCityRecords() {
        return callingInCityRecords;
    }
    public void addCallingInCityRecords(CallRecord callingInCityRecords) {
        this.callingInCityRecords.add(callingInCityRecords);
    }
    public ArrayList<CallRecord> getCallingInProvinceRecords() {
        return callingInProvinceRecords;
    }
    public void addCallingInProvinceRecords(CallRecord callingInProvinceRecords) {
        this.callingInProvinceRecords.add(callingInProvinceRecords);
    }
    public ArrayList<CallRecord> getCallingInLandRecords() {
        return callingInLandRecords;
    }
    public void addCallingInLandRecords(CallRecord callingInLandRecords) {
        this.callingInLandRecords.add(callingInLandRecords);
    }
    public ArrayList<CallRecord> getAnswerInCityRecords() {
        return answerInCityRecords;
    }
    public void addAnswerInCityRecords(CallRecord answerInCityRecords) {
        this.answerInCityRecords.add(answerInCityRecords);
    }
    public ArrayList<CallRecord> getAnswerInProvinceRecords() {
        return answerInProvinceRecords;
    }
    public void addAnswerInProvinceRecords(CallRecord answerInProvinceRecords) {
        this.answerInProvinceRecords.add(answerInProvinceRecords);
    }
    public ArrayList<CallRecord> getAnswerInLandRecords() {
        return answerInLandRecords;
    }
    public void addAnswerInLandRecords(CallRecord answerInLandRecords) {
        this.answerInLandRecords.add(answerInLandRecords);
    }
    public ArrayList<CallRecord> getCallingCityToCityRecords() {
        return callingCityToCityRecords;
    }
    public void addCallingCityToCityRecords(CallRecord callingCityToCityRecords) {
        this.callingCityToCityRecords.add(callingCityToCityRecords);
    }
    public ArrayList<CallRecord> getCallingCityToProvinceRecords() {
        return callingCityToProvinceRecords;
    }
    public void addCallingCityToProvinceRecords(CallRecord callingCityToProvinceRecords) {
        this.callingCityToProvinceRecords.add(callingCityToProvinceRecords);
    }
    public ArrayList<CallRecord> getCallingCityToOutProvinceRecords() {
        return callingCityToOutProvinceRecords;
    }
    public void addCallingCityToOutProvinceRecords(CallRecord callingCityToOutProvinceRecords) {
        this.callingCityToOutProvinceRecords.add(callingCityToOutProvinceRecords);
    }
    public ArrayList<CallRecord> getCallingProvinceRecords() {
        return callingProvinceRecords;
    }
    public void addCallingProvinceRecords(CallRecord callingProvinceRecords) {
        this.callingProvinceRecords.add(callingProvinceRecords);
    }
    public ArrayList<CallRecord> getCallingOutProvinceRecords() {
        return callingOutProvinceRecords;
    }
    public void addCallingOutProvinceRecords(CallRecord callingOutProvinceRecords) {
        this.callingOutProvinceRecords.add(callingOutProvinceRecords);
    }
    public ArrayList<CallRecord> getAnswerOutProvinceRecords() {
        return AnswerOutProvinceRecords;
    }
    public void addAnswerOutProvinceRecords(CallRecord answerOutProvinceRecords) {
        AnswerOutProvinceRecords.add(answerOutProvinceRecords);
    }
    public ArrayList<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }
    public void addSendMessageRecords(MessageRecord sendMessageRecords) {
        this.sendMessageRecords.add(sendMessageRecords);
    }
    public ArrayList<MessageRecord> getRecieveMessageRecords() {
        return recieveMessageRecords;
    }
    public void addRecieveMessageRecords(MessageRecord recieveMessageRecords) {
        this.recieveMessageRecords.add(recieveMessageRecords);
    }
    
}


class MessageRecord extends CommunicationRecord{
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
    
}
abstract class CallChargeRule extends ChargeRule {
    public double calcost(ArrayList<CallRecord> callRecord) {
        return 0;
    }
}
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 ChargeMode {
    private ArrayList<ChargeRule> chargeRules = new ArrayList<ChargeRule>();

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

    public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
        this.chargeRules = chargeRules;
    }
    
    public double calCost(UserRecords userRecords) {
        return 0;
    }
    
    public double getMonthlyRent() {
        return 0;
    }
}
abstract class ChargeRule {

}
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 LandlinePhoneCharging extends ChargeMode {
    private double monthlyRent = 20;
    @Override
    public double calCost(UserRecords userRecords) {
        LandPhoneInCityRule city = new LandPhoneInCityRule();
        LandPhoneInProvinceRule province = new LandPhoneInProvinceRule();
        LandPhoneInRule land = new LandPhoneInRule();
        return city.calcost(userRecords.getCallingInCityRecords()) + province.calcost(userRecords.getCallingInProvinceRecords()) + land.calcost(userRecords.getCallingInLandRecords());
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
    
}
class LandPhoneInCityRule extends CallChargeRule {

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

}
class LandPhoneInProvinceRule extends CallChargeRule {

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

}
class LandPhoneInRule extends CallChargeRule {

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

}
class MobilelinePhoneCharging extends ChargeMode {
    private double monthlyRent = 15;
    @Override
    public double calCost(UserRecords userRecords) {
        MobilePhoneCityToCityRule cc = new MobilePhoneCityToCityRule();
        MobilePhoneCityToProvinceRule cp = new MobilePhoneCityToProvinceRule();
        MobilePhoneCityToOutProvinceRule cop = new MobilePhoneCityToOutProvinceRule();
        MobilePhoneOutProvinceCallRule opc = new MobilePhoneOutProvinceCallRule();
        MobilePhoneOutProvinceAnswerRule cpa = new MobilePhoneOutProvinceAnswerRule();
        MobilePhoneInProvinceRule p = new MobilePhoneInProvinceRule();
        return cc.calcost(userRecords.getCallingCityToCityRecords()) + cp.calcost(userRecords.getCallingCityToProvinceRecords()) + cop.calcost(userRecords.getCallingCityToOutProvinceRecords()) + opc.calcost(userRecords.getCallingOutProvinceRecords())+ cpa.calcost(userRecords.getAnswerOutProvinceRecords()) + p.calcost(userRecords.getCallingProvinceRecords());
    }

    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
    
}
class MobilePhoneCityToCityRule extends CallChargeRule {

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

}
class MobilePhoneCityToOutProvinceRule extends CallChargeRule {

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

}
class MobilePhoneCityToProvinceRule extends CallChargeRule {

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

}
class MobilePhoneInProvinceRule extends CallChargeRule {

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

}
class MobilePhoneOutProvinceAnswerRule extends CallChargeRule {

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

}
class MobilePhoneOutProvinceCallRule extends CallChargeRule {

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

class psz{
    private String name;
    private int age;
    private String number;
    psz(){
        System.out.println("防抄袭查重无用类");
        System.out.println("");
        System.out.println("没用也有用");
    }
}

(3)电信计费系列3-短信计费

这次的PTA大作业是最为简单的,因为他相比起之前没有要新学或者新使用的东西,依旧是使用正则表达式然后继续后面的一套步骤,且可以删除掉很多累赘的属性与代码。唯一要注意的是判断短信内容的时候是,把分割的部分加一个空格连接起来,但是恰恰忽略了多空格的问题,找了好久才发现这个问题,最后还是采取最笨的办法直接取出最后一段内容作为短信内容,这样才解决了问题,而后面再作业截至后我再次去写这个正则表达式的代码也很好解决了这个问题。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.text.DecimalFormat;

public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<User> users = new ArrayList<>();
        String regex1 = "^u-[0-9]{11}\\s3";
        String regex2 = "^m-[0-9]{11}\\s[0-9]{11}\\s[[A-Z][a-z][0-9]\\,\\.\\s]+$";
        String message = input.nextLine();
        Pattern p1=Pattern.compile(regex1);
        Pattern p2=Pattern.compile(regex2);
        Matcher m;
        int a = 0;
        while(!message.equals("end")){
            m=p1.matcher(message);
            if(m.find()){
                users.add(enter(message));
            }
            m=p2.matcher(message);
            if(m.find()) {
                send(message, users);
            }
            message = input.nextLine();
        }
        for(int i = 0;i<users.size();i++) {
            System.out.println(users.get(users.size()-1-i).getNumber()+" "+new DecimalFormat("#0.0#").format(users.get(users.size()-1-i).calCost())+" "+new DecimalFormat("#0.0#").format(users.get(users.size()-1-i).calBalance()));
        }
        input.close();
    }
    
    public static User enter(String m){
        String[] s1 = m.split("-");
        String[] s2 = s1[1].split(" ");
        int n = Integer.parseInt(s2[1]);

        User user = new User(s2[0], n);

        return user;
    }
    
    public static void send(String m, ArrayList<User> users){
        String[] s1 = m.split("-");
        String[] s2 = s1[1].split(" ");
        String s=m.substring(26, m.length());
        MessageRecord messageRecord;
        for(int i = 0;i<users.size();i++){
            if(s2[0].equals(users.get(i).getNumber())){
                messageRecord = new MessageRecord(s);
                users.get(i).getSendMessageRecords().add(messageRecord);
            }
        }
    }
}

class User{
    private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    private double balance = 100;
    private ChargeMode chargeMode;
    private String number;
    
    User(String number,int n){
        this.number = number;
        if(n==3) {
            chargeMode = new MobilePhoneCharging();
        }
    }
    
    public double calBalance() {
        return balance-calCost();
    }
    public double calCost() {
        return chargeMode.calCost(sendMessageRecords);
    }
    
    public ArrayList<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }
    public void setSendMessageRecords(ArrayList<MessageRecord> sendMessageRecords) {
        this.sendMessageRecords = sendMessageRecords;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    
}

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(ArrayList<MessageRecord> messageRecord);
}

class MobilePhoneCharging extends ChargeMode {
    MobilePhoneCharging(){
        ChargeRule chargeRule = new SendMessageRule();
        getChargeRules().add(chargeRule);
    }
    public double calCost(ArrayList<MessageRecord> messageRecord){
        getChargeRules().get(0);
        return getChargeRules().get(0).calcost(messageRecord);
    }
}

abstract class ChargeRule {
    public abstract double calcost(ArrayList<MessageRecord> messageRecord);
}
//
class SendMessageRule extends ChargeRule{
    public double calcost(ArrayList<MessageRecord> messageRecord){
        double cost = 0;
        int number = 0;
        int sum = 0;
        for(int i = 0;i<messageRecord.size();i++) {
            number = messageRecord.get(i).getMessage().length();
            if(number%10==0) {
                sum = sum + number/10;
            }else {
                sum = sum + number/10+1;
            }
        }
        if(sum<=3)
            cost = sum*0.1;
        else if(sum<=5)
            cost = 0.3+(sum-3)*0.2;
        else
            cost = 0.3+0.4+(sum-5)*0.3;
        return cost;
    }
}

class MessageRecord{
    private String message;
    MessageRecord(String message){
        this.message = message;
    }
    public String getMessage(){
        return message;
    }
    public void sendMessage(String message){
        this.message = message;
    }
}

 

采坑心得

  1.就是正则表达式,写好一个正则表达式真的很重要,它可以帮你判断很多东西,你只需要写出一个抽象的东西然后匹配所有符合他的字符串。

  2.就是逻辑一定要清晰,电信计费的大作业就是需要很好的逻辑,我觉得只要逻辑清晰就写的挺好,就有了思路,按照那个思路就可以很快的写出来;

  3.计算信息计费的时候要一条一条的算钱,我开始是先直接计算有几条信息,然后再计算每条信息的信息量,但是出了很大的问题,就还是要一条一条的算钱的好。

  4.这个题目建的方法比较多,而且比较相似容易用混,要多加小心,调试了好久才发现自己犯了这样的低级错误。

改进建议
   本人还是建议,PTA的系统能和idea或者eclipse一样能有多个页,这样无论时在以后的代码上传还是写代码也能方便很多,更易于编程
 
总结
  这次的PTA大作业虽然难度有些大,但是完成时内心也非常的具有成就感在此处,我也收获颇丰。
  1.在写一些算法的时候因该要多写一些备注不然自己看的时候或者别人看的时候要思考很久这一段代码是干嘛的做什么用的,而且这样还方便自己修改。
  2.我学会了抽象类与多态的灵活运用,并掌握了许多排序方法。
  3..对题目的理解和对方法的正确使用非常重要,对题目理解不对,我吃了很多亏,应提高这些方面的能力。
posted @ 2022-06-18 22:31  彭嗣争  阅读(46)  评论(0)    收藏  举报