最后三次大作业的总结Blog

------------恢复内容开始------------

1.前言

本次博客中,我将对座机,手机计费问题进行分析。这几次的大作业可以分为三个阶段。第一个阶段:座机计费。第二个阶段:手机与座机计费。第三个阶段:短信计费。总的来说,第二次大作业是最难的,第一次大作业作为开头也不简单,而第三次作业承接了前两次大作业的代码,故更为简单。因此,我将花费较大的篇幅对前两次大作业进行分析。

2.设计与分析

2.1 第一次大作业

在第一次大作业中,我们需要注意的是格式问题,尤其是时间的格式。直接进行判断不是一个明智额选择,因此,依题意,我们采用SimpleDateFormate方法来判断。同时,时间的计算也是一个难点。为此,我是用的是Data类中的Time方法。在判断完格式,计算完时间后,我们就需要对其进行计算。我们不难发现,座机计费的依据是接通座机的区号,与呼叫座机的区号无关,因此,我们仅需要判断接通座机的所在地。座机的区号包含在座机号码内部。在判断完地点后,我们就需要将各个通话记录存进各个ArrayList数组内部。

代码如下:

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ArrayList<User> U = new ArrayList<User>();
        ArrayList<CallRecord> C = new ArrayList<CallRecord>();
        Scanner in = new Scanner(System.in);
        IsDate is = new IsDate();
        Map phone=new HashMap(); 
        //User use= new User();
        LandlinePhoneCharging charge = new LandlinePhoneCharging();
        while(true) {
            String str = in.nextLine();
            if(str.matches("u-0791[0-9]{7,8}[ ]0")) {
                User use= new User();
                String str1=str.substring(2, str.length()-2);
                use.setNumber(str1);
                U.add(use);
            }
            else if(str.matches("t-0791[0-9]{7,8}[ ]" + "[0-9]{3,4}[0-9]{7,8}[ ]" + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ]"
                    + "[0-9]{2}:[0-9]{2}:[0-9]{2}" + "[ ]"
                    + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ][0-9]{2}:[0-9]{2}:[0-9]{2}")) {
                CallRecord call = new CallRecord();
                String[] x = str.split(" ");
                String a=x[0];
                String str3=a.substring(2,a.length());
                String b=x[1];
                String c=x[2]+" "+x[3];
                String d=x[4]+" "+x[5];
                call.setCallingNumber(str3);
                call.setAnswerNumber(b);
                if(is.isDate(c, "yyyy.MM.dd HH:mm:ss")&&is.isDate(d, "yyyy.MM.dd HH:mm:ss")) {
                    call.setEndTime(d);
                    call.setStartTime(c);
                }
                call.setAnswerAddressAreaCode(b);
                C.add(call);    
            }
            else if(str.matches("end")) {
                break;
            }
        }
        if(U.size()>=2) {
            for(int i=0;i<U.size();i++) {
                for(int j=i+1;j<U.size();j++) {
                    if(U.get(i).getNumber()==U.get(j).getNumber()) {
                        U.remove(j);
                    }
                }
            }
        }
        for(int i=0;i<U.size();i++) {
            for(int j=0;j<C.size();j++) {
                if(U.get(i).getNumber().equals(C.get(j).callingNumber)) {
                    U.get(i).userRecord.addCallingInCityRecords(C.get(j));
                    U.get(i).userRecord.addCallingInProvinceRecords(C.get(j));
                    U.get(i).userRecord.addCallingInLandRecords(C.get(j));
                }
            }
        }
        for(int i=0;i<U.size();i++) {
            double a = OutFormat.doubleFormat( charge.calCost(U.get(i).userRecord));
            phone.put(U.get(i).getNumber(), a);
        }
        Set set=phone.keySet();
        Object[] arr=set.toArray();
        Arrays.sort(arr);
        for(Object key:arr){
             double d=OutFormat.doubleFormat(Double.parseDouble(phone.get(key).toString()));
             System.out.println(key+" "+phone.get(key)+" "+(80-d));
         }
    }
}
abstract class CallChargeRule extends ChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        return 0;
    }
}
class CallRecord extends CommunicationRecord{
    Date startTime;
    Date endTime;
    String callingAddressAreaCode;
    String answerAddressAreaCode;
    SimpleDateFormat a = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    SimpleDateFormat b = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    
    public Date getStartTime() {
        return startTime;
    }
    
    public void setStartTime(String startTime) {
        try {
            this.startTime =  b.parse(startTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    public Date getEndTime() {
        return endTime;
    }
    
    public void setEndTime(String endTime) {
        try {
            this.endTime =  a.parse(endTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    public void setCallingAddressAreaCode(String callingNumber) {
        this.callingAddressAreaCode=callingNumber.substring(2, 6);
    }
    public String getAnswerAddressAreaCode() {
        return answerAddressAreaCode;
    }
    public void setAnswerAddressAreaCode(String answerNumber) {
        this.answerAddressAreaCode = answerNumber.substring(0, 4);
    }
    public int Time() {
         Date fromDate3 = startTime;
         Date toDate3 = endTime;
         if(fromDate3!=null&&toDate3!=null) {
             long from3 = fromDate3.getTime();  
             long to3 = toDate3.getTime();  
             int seconds = (int) ((to3 - from3) / (1000));
             if(seconds%60==0&&seconds>0) {
                 return seconds/60;
             }
             if(seconds%60!=0&&seconds>0) {
                 return seconds/60+1;
             }
             else {
                 return 0;
             }
         }
         else {
             return 0;
         }
    }
}

abstract class ChargeMode {
    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 {
    String callingNumber;
    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 IsDate {
    public static boolean isDate(String str_input,String rDateFormat){
        if (!isNull(str_input)) {
                 SimpleDateFormat formatter = new SimpleDateFormat(rDateFormat);
                 formatter.setLenient(false);
                 try {
                     formatter.format(formatter.parse(str_input));
                 } catch (Exception e) {
                     return false;
                 }
                 return true;
             }
        return false;

        }
        public static boolean isNull(String str){
        if(str==null)
        return true;
        else
        return false;
        }
}
class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;
    @Override
    public double calCost(UserRecords userRecords) {
        LandPhoneInCityRule a = new LandPhoneInCityRule();
        LandPhoneInProvinceRule b = new LandPhoneInProvinceRule();
        LandPhoneInlandRule c = new LandPhoneInlandRule();
        return a.calCost(userRecords.getCallingInCityRecords())+b.calCost(userRecords.getCallingInProvinceRecords())+c.calCost(userRecords.getCallingInLandRecords());
    }
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}
class LandPhoneInCityRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.1;
        }
        return sum;
    }
}
class LandPhoneInlandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.6;
        }
        return sum;
    }
}
class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MessageRecord extends CommunicationRecord{
    String message;
    public String getMessage() {
        return message;
    }

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

}
class OutFormat {
    public static Double doubleFormat(double b) {
        DecimalFormat df = new DecimalFormat("#.00");
        Double output = Double.valueOf(df.format(b));
        return output;
    }
}
class User {
    UserRecords userRecord = new UserRecords();
    double balance = 100;
    ChargeMode chargeMode;
    String number;
    public double callBalance() {
        return balance-calCost();
    }
    public double calCost() {
        return chargeMode.calCost(userRecord);
    }
    public UserRecords getUserRecords() {
        return userRecord;
    }
    public void setUserRecords(UserRecords userRecords) {
        this.userRecord=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 {
    int flag=0;
    int flag1=0;
    ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
    public void addCallingInCityRecords(CallRecord callRecord) {
        if(callRecord.getAnswerAddressAreaCode().equals("0791")) {
            callingInCityRecords.add(callRecord);
            flag++;
        }
    }
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        String a = callRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                callingInProvinceRecords.add(callRecord);
                flag1++;
            }
        }
        }
        if(b==701) {
            callingInProvinceRecords.add(callRecord);
            flag1++;
        }
    }
    public void addCallingInLandRecords(CallRecord callRecord) {
        String a = callRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            callingInLandRecords.add(callRecord);
        }
    }
    public void addAnswerInCityRecords(CallRecord answerRecord) {
        
    }
    public void addAnswerInProvinceRecords(CallRecord answerRecord) {
        
    }
    public void addAnswerInLandRecords(CallRecord answerRecord) {
    
    }
    public void addSendMessageRecords(CallRecord answerRecord) {
        
    }
    public void addReceiveMessageRecords(CallRecord answerRecord) {
        
    }
    public void addSendMessageRecords(MessageRecord sendMessageRecord) {
        
    }
    public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
        
    }
    public ArrayList<MessageRecord> getSendMessageRecords(){
        return receiveMessageRecords;
        
    }
    public ArrayList<MessageRecord> getReceiveMessageRecords(){
        return receiveMessageRecords;
        
    }
    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 answerInCityRecords;
        
    }
    public ArrayList<CallRecord> getAnswerInLandRecords(){
        return answerInCityRecords;
        
    }

}

 

 

2.2 第二次大作业

第二次大作业在第一次大作业的基础上添加了手机计费。手机计费与座机计费不同,需要同时判断呼叫手机与接听手机的区号,同时不仅需要计算呼叫手机呼叫时产生的花费,还需要计算接听手机接听时产生的花费。与第一次类是,我们需要将每条通话记录的两个区号与号码提取出来后加入CallRecord数组中。与座机不同,手机的区号是不包括在手机号码内部的,而是跟在手机号码后的一串数字。

总的来说,我们可以将接听电话分为五大类:1:市内打市内。2:市内打省内。3:市内打省外。4:省内打全国。5:省外打全国。

而接听电话也可以分为两类:1:市内,省内接听电话。2:省外接听电话。

通话记录也可以分为四类:1:座机打座机。2:座机打手机。3:手机打座机。4:手机打手机。

每个开户号码既可能是呼叫号码,也可能是接听号码,因此,我们需要一个循环来遍历每一个通话记录。而在遍历每一个通话记录时,我们需要对其判断两次,判断其是呼叫号码还是接听号码。再在每个判断下将通话记录存入相应的UserRecord内。在计算费用时,接听费用与呼叫费用需要写在两个类中。在需要时只调用一个计算类。

代码如下:

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ArrayList<User> U = new ArrayList<User>();
        ArrayList<CallRecord> C = new ArrayList<CallRecord>();
        Scanner in = new Scanner(System.in);
        IsDate is = new IsDate();
        Map phone=new HashMap(); 
        //User use= new User();
        LandlinePhoneCharging charge = new LandlinePhoneCharging();
        MoveCharging charge1 = new MoveCharging();
        while(true) {
            String str = in.nextLine();
            if(str.matches("u-0791[0-9]{7,8}[ ]0")||str.matches("u-1[0-9]{10}[ ]1")) {
                User use= new User();
                String[] x = str.split(" ");
                String str1=x[0].substring(2, x[0].length());
                use.setNumber(str1);
                int b = Integer.parseInt(x[1]);
                use.setNumber1(b);
                U.add(use);
            }            
            //座机打座机
            else if(str.matches("t-0791[0-9]{7,8}[ ]" + "[0-9]{3,4}[0-9]{7,8}[ ]" + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ]"
                    + "[0-9]{2}:[0-9]{2}:[0-9]{2}" + "[ ]"
                    + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ][0-9]{2}:[0-9]{2}:[0-9]{2}")) {
                CallRecord call = new CallRecord();
                String[] x = str.split(" ");
                String a=x[0];
                String str3=a.substring(2,a.length());
                String b=x[1];
                String c=x[2]+" "+x[3];
                String d=x[4]+" "+x[5];
                call.setCallingNumber(str3);
                call.setAnswerNumber(b);
                if(is.isDate(c, "yyyy.MM.dd HH:mm:ss")&&is.isDate(d, "yyyy.MM.dd HH:mm:ss")) {
                    call.setEndTime(d);
                    call.setStartTime(c);
                }
                call.setAnswerAddressAreaCode(b);
                call.setCallingAddressAreaCode(str3);
                C.add(call);    
            }
            //座机打手机
            else if(str.matches("t-0791[0-9]{7,8}[ ]" + "1[0-9]{10}[ ]" + "[0-9]{3,4}[ ]" +"[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ]"
                    + "[0-9]{2}:[0-9]{2}:[0-9]{2}" + "[ ]"
                    + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ][0-9]{2}:[0-9]{2}:[0-9]{2}")) {
                CallRecord call = new CallRecord();
                String[] x = str.split(" ",7);
                String a=x[0];
                String str3=a.substring(2,a.length());
                String b=x[1];
                String str4=x[2];//区号
                String c=x[3]+" "+x[4];
                String d=x[5]+" "+x[6];
                call.setCallingNumber(str3);
                call.setAnswerNumber(b);
                if(is.isDate(c, "yyyy.MM.dd HH:mm:ss")&&is.isDate(d, "yyyy.MM.dd HH:mm:ss")) {
                    call.setEndTime(d);
                    call.setStartTime(c);
                }
                call.setAnswerAddressAreaCodeshouji(str4);
                call.setCallingAddressAreaCode(str3);
                C.add(call);    
            }
            //手机打座机
            else if(str.matches("t-1[0-9]{10}[ ]" + "[0-9]{3,4}[ ]" + "[0-9]{3,4}[0-9]{7,8}[ ]" +"[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ]"
                    + "[0-9]{2}:[0-9]{2}:[0-9]{2}" + "[ ]"
                    + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ][0-9]{2}:[0-9]{2}:[0-9]{2}")) {
                CallRecord call = new CallRecord();
                String[] x = str.split(" ",7);
                String a=x[0];
                String str3=a.substring(2,a.length());
                String str4=x[1];//区号
                String b=x[2];
                String c=x[3]+" "+x[4];
                String d=x[5]+" "+x[6];
                call.setCallingNumber(str3);
                call.setAnswerNumber(b);
                if(is.isDate(c, "yyyy.MM.dd HH:mm:ss")&&is.isDate(d, "yyyy.MM.dd HH:mm:ss")) {
                    call.setEndTime(d);
                    call.setStartTime(c);
                }
                call.setAnswerAddressAreaCode(b);
                call.setCallingAddressAreaCodeshouji(str4);
                C.add(call);    
            }
            //手机打手机
            else if(str.matches("t-1[0-9]{10}[ ]" + "[0-9]{3,4}[ ]" + "1[0-9]{10}[ ]" + "[0-9]{3,4}[ ]"+"[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ]"
                    + "[0-9]{2}:[0-9]{2}:[0-9]{2}" + "[ ]"
                    + "[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}[ ][0-9]{2}:[0-9]{2}:[0-9]{2}")) {
                CallRecord call = new CallRecord();
                String[] x = str.split(" ",8);
                String a=x[0];
                String str3=a.substring(2,a.length());
                String str4=x[1];//区号
                String b=x[2];
                String str5=x[3];//区号
                String c=x[4]+" "+x[5];
                String d=x[6]+" "+x[7];
                call.setCallingNumber(str3);
                call.setAnswerNumber(b);
                if(is.isDate(c, "yyyy.MM.dd HH:mm:ss")&&is.isDate(d, "yyyy.MM.dd HH:mm:ss")) {
                    call.setEndTime(d);
                    call.setStartTime(c);
                }
                call.setAnswerAddressAreaCodeshouji(str5);
                call.setCallingAddressAreaCodeshouji(str4);
                C.add(call);    
            }
            else if(str.matches("end")) {
                break;
            }
        }
            for (int i = 0; i < U.size(); i++) {
                for (int j = 0; j < U.size(); j++) {
                    if (i != j && U.get(i).getNumber().equals(U.get(j).getNumber())) {
                        U.remove(U.get(j));
                    }
                }
            }
        for(int i=0;i<U.size();i++) {
            for(int j=0;j<C.size();j++) {
                if(U.get(i).getNumber().equals(C.get(j).callingNumber)&&U.get(i).getNumber1()==0) {
                    U.get(i).userRecord.addAnswerInCityRecords(C.get(j));
                    U.get(i).userRecord.addAnswerInProvinceRecords(C.get(j));
                    U.get(i).userRecord.addAnswerInLandRecords(C.get(j));
                }
                if(U.get(i).getNumber().equals(C.get(j).answerNumber)&&U.get(i).getNumber1()==0) {
                    U.get(i).userRecord.addCallingInCityRecords(C.get(j));
                    U.get(i).userRecord.addCallingInProvinceRecords(C.get(j));
                    U.get(i).userRecord.addCallingInLandRecords(C.get(j));
                }
                if(U.get(i).getNumber().equals(C.get(j).callingNumber)&&U.get(i).getNumber1()==1) {
                    U.get(i).userRecord.addMoveCallingInCityRecords(C.get(j));
                    U.get(i).userRecord.addMoveCallingInProvinceRecords(C.get(j));
                    U.get(i).userRecord.addMoveCallingInLandRecords(C.get(j));
                }
                if(U.get(i).getNumber().equals(C.get(j).answerNumber)&&U.get(i).getNumber1()==1) {
                    U.get(i).userRecord.addMoveanswerInCityRecords(C.get(j));
                    U.get(i).userRecord.addMoveanswerInLandRecords(C.get(j));;
                    U.get(i).userRecord.addMoveanswerInProvinceRecords(C.get(j));;
                }
            }
        }
        Collections.sort(U, new MyComparatorToUser());
        for(int i=0;i<U.size();i++) {
            if(U.get(i).getNumber1()==1) {
                double a = OutFormat.doubleFormat( charge1.cal(U.get(i).userRecord));
                System.out.println(U.get(i).getNumber()+" "+ a+" "+(85-a));
            }
            if(U.get(i).getNumber1()==0) {
                double a = OutFormat.doubleFormat( charge.calCost(U.get(i).userRecord));
                System.out.println(U.get(i).getNumber()+" "+ a+" "+(80-a));
            }
        }
}
static    class MyComparatorToUser implements Comparator<User>{
    @Override
    public int compare(User u1, User u2) {
        double p = Double.parseDouble(u1.number);
        double q = Double.parseDouble(u2.number);
        if(u1.number.charAt(0)=='0'&&u2.number.charAt(0)=='0') {
            return (int)(p-q);
        }
        if(u1.number.charAt(0)=='0') {
            p=0;
        }
        if(u2.number.charAt(0)=='0') {
            q=0;
        }
        return (int)(p-q);
    }
}
}
abstract class CallChargeRule extends ChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        return 0;
    }
}
class CallRecord extends CommunicationRecord{
    Date startTime;
    Date endTime;
    String callingAddressAreaCode;
    String answerAddressAreaCode;
    SimpleDateFormat a = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    SimpleDateFormat b = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    
    public Date getStartTime() {
        return startTime;
    }
    
    public void setStartTime(String startTime) {
        try {
            this.startTime =  b.parse(startTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    public Date getEndTime() {
        return endTime;
    }
    
    public void setEndTime(String endTime) {
        try {
            this.endTime =  a.parse(endTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    public void setCallingAddressAreaCode(String callingNumber) {
        this.callingAddressAreaCode=callingNumber.substring(2, 6);
    }
    public void setCallingAddressAreaCodeshouji(String callingNumber) {
        this.callingAddressAreaCode=callingNumber;
    }
    public String getAnswerAddressAreaCode() {
        return answerAddressAreaCode;
    }
    public void setAnswerAddressAreaCodeshouji(String answerNumber) {
        this.answerAddressAreaCode = answerNumber;
    }
    public void setAnswerAddressAreaCode(String answerNumber) {
        this.answerAddressAreaCode = answerNumber.substring(0, 4);
    }
    public int Time() {
         Date fromDate3 = startTime;
         Date toDate3 = endTime;
         if(fromDate3!=null&&toDate3!=null) {
             long from3 = fromDate3.getTime();  
             long to3 = toDate3.getTime();  
             int seconds = (int) ((to3 - from3) / (1000));
             if(seconds%60==0&&seconds>0) {
                 return seconds/60;
             }
             if(seconds%60!=0&&seconds>0) {
                 return seconds/60+1;
             }
             else {
                 return 0;
             }
         }
         else {
             return 0;
         }
    }
}
abstract class ChargeMode {
    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 {
    String callingNumber;
    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 IsDate {
    public static boolean isDate(String str_input,String rDateFormat){
        if (!isNull(str_input)) {
                 SimpleDateFormat formatter = new SimpleDateFormat(rDateFormat);
                 formatter.setLenient(false);
                 try {
                     formatter.format(formatter.parse(str_input));
                 } catch (Exception e) {
                     return false;
                 }
                 return true;
             }
        return false;
        }
        public static boolean isNull(String str){
        if(str==null)
        return true;
        else
        return false;
        }
}
class LandAnswerInCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandAnswerInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandAnswerInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;
    @Override
    public double calCost(UserRecords userRecords) {
        LandPhoneInCityRule a = new LandPhoneInCityRule();
        LandPhoneInProvinceRule b = new LandPhoneInProvinceRule();
        LandPhoneInlandRule c = new LandPhoneInlandRule();
        LandAnswerInCity d = new LandAnswerInCity();
        LandAnswerInland e = new LandAnswerInland();
        LandAnswerInProvince f = new LandAnswerInProvince();
        
        return a.calCost(userRecords.getAnswerInCityRecords())+b.calCost(userRecords.getAnswerInProvinceRecords())+c.calCost(userRecords.getAnswerInLandRecords())+
                d.calCost(userRecords.getAnswerInCityRecords())+e.calCost(userRecords.getAnswerInLandRecords())+f.calCost(userRecords.getAnswerInProvinceRecords());
    }
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}
class LandPhoneInCityRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.1;
        }
        return sum;
    }
}
class LandPhoneInlandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.6;
        }
        return sum;
    }
}
class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MessageRecord extends CommunicationRecord{
    String message;
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
class MoveAnswerInCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class MoveAnswerInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MoveAnswerInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class MoveCharging extends ChargeMode{
    public double cal(UserRecords userRecords) {
    MoveAnswerInCity a = new MoveAnswerInCity();
    MoveAnswerInland b = new MoveAnswerInland();
    MoveAnswerInProvince c = new MoveAnswerInProvince();
    MovePhonefromCitytoCity d = new MovePhonefromCitytoCity();
    MovePhonefromCitytoland e = new MovePhonefromCitytoland();
    MovePhonefromCitytoProvince f = new MovePhonefromCitytoProvince();
    MovePhoneInland g = new MovePhoneInland();
    MovePhoneInProvince h = new MovePhoneInProvince();
    return a.calCost(userRecords.getMoveanswerInCityRecords())+b.calCost(userRecords.getMoveanswerInLandRecords())+
            c.calCost(userRecords.getMoveanswerInProvinceRecords())+d.calCost(userRecords.getMoveCallingfromCitytoCityRecords())+
            e.calCost(userRecords.getMoveCallingfromCitytoLandRecords())+f.calCost(userRecords.getMoveCallingfromCitytoProvinceRecords())+
            g.calCost(userRecords.getMoveCallingInLandRecords())+h.calCost(userRecords.getMoveCallingInProvinceRecords());
    }
}
class MovePhonefromCitytoCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.1;
        }
        return sum;
    }
}
class MovePhonefromCitytoland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MovePhonefromCitytoProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.2;
        }
        return sum;
    }
}
class MovePhoneInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.6;
        }
        return sum;
    }
}
class MovePhoneInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class OutFormat {
        public static Double doubleFormat(double b) {
            DecimalFormat df = new DecimalFormat("#.00");
            Double output = Double.valueOf(df.format(b));
            return output;
        }
    }
class User {
    UserRecords userRecord = new UserRecords();
    double balance = 100;
    ChargeMode chargeMode;
    String number;
    int number1;
    public double callBalance() {
        return balance-calCost();
    }
    public double calCost() {
        return chargeMode.calCost(userRecord);
    }
    public UserRecords getUserRecords() {
        return userRecord;
    }
    public void setUserRecords(UserRecords userRecords) {
        this.userRecord=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;
    }
    public int getNumber1() {
        return number1;
    }
    public void setNumber1(int number1) {
        this.number1=number1;
    }
}
class UserRecords {
    public ArrayList<CallRecord> getMoveanswerInLandRecords() {
        return MoveanswerInLandRecords;
    }

    

    public ArrayList<CallRecord> getMoveanswerInProvinceRecords() {
        return MoveanswerInProvinceRecords;
    }

    

    public ArrayList<CallRecord> getMoveanswerInCityRecords() {
        return MoveanswerInCityRecords;
    }

    
    public ArrayList<CallRecord> getMoveCallingfromCitytoLandRecords() {
        return MoveCallingfromCitytoLandRecords;
    }

    

    public ArrayList<CallRecord> getMoveCallingfromCitytoProvinceRecords() {
        return MoveCallingfromCitytoProvinceRecords;
    }


    public ArrayList<CallRecord> getMoveCallingfromCitytoCityRecords() {
        return MoveCallingfromCitytoCityRecords;
    }


    public ArrayList<CallRecord> getMoveCallingInProvinceRecords() {
        return MoveCallingInProvinceRecords;
    }

    public ArrayList<CallRecord> getMoveCallingInLandRecords() {
        return MoveCallingInLandRecords;
    }
    ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    //
    ArrayList<CallRecord> MoveanswerInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveanswerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveanswerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingInLandRecords = new ArrayList<CallRecord>();
    //
    ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
    //座机市内打电话
    public void addCallingInCityRecords(CallRecord callRecord) {
        if(callRecord.getCallingAddressAreaCode().equals("0791")) {
            callingInCityRecords.add(callRecord);
        }
    }
    //座机省内打电话
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        String a = callRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                callingInProvinceRecords.add(callRecord);
            }
        }
        }
        if(b==701) {
            callingInProvinceRecords.add(callRecord);
        }
    }
    //座机省外打电话
    public void addCallingInLandRecords(CallRecord callRecord) {
        String a = callRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            callingInLandRecords.add(callRecord);
        }
    }
    //座机室内接电话
    public void addAnswerInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
            answerInCityRecords.add(answerRecord);
        }
    }
    //座机省内接电话
    public void addAnswerInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                answerInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            answerInProvinceRecords.add(answerRecord);
        }
    }
    //座机省外接电话
    public void addAnswerInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            answerInLandRecords.add(answerRecord);
        }
    }
    //手机市内接电话
    public void addMoveanswerInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
            MoveanswerInCityRecords.add(answerRecord);
        }
    }
    //手机省内接电话
    public void addMoveanswerInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                MoveanswerInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            MoveanswerInProvinceRecords.add(answerRecord);
        }
    }
    //手机省外接电话
    public void addMoveanswerInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            MoveanswerInLandRecords.add(answerRecord);
        }
    }
  //手机市内打电话
    public void addMoveCallingInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getCallingAddressAreaCode().equals("0791")) {
            if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
                MoveCallingfromCitytoCityRecords.add(answerRecord);
            }
            else if(answerRecord.getAnswerAddressAreaCode().equals("0790")||
                answerRecord.getAnswerAddressAreaCode().equals("0792")||answerRecord.getAnswerAddressAreaCode().equals("0793")||
                answerRecord.getAnswerAddressAreaCode().equals("0794")||answerRecord.getAnswerAddressAreaCode().equals("0795")||
                answerRecord.getAnswerAddressAreaCode().equals("0796")||answerRecord.getAnswerAddressAreaCode().equals("0797")||
                answerRecord.getAnswerAddressAreaCode().equals("0798")||answerRecord.getAnswerAddressAreaCode().equals("0799")||
                answerRecord.getAnswerAddressAreaCode().equals("0701")) {
                MoveCallingfromCitytoProvinceRecords.add(answerRecord);
            }
            else {
                MoveCallingfromCitytoLandRecords.add(answerRecord);
            }
        }
    }
    //手机省内打电话
    public void addMoveCallingInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                MoveCallingInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            MoveCallingInProvinceRecords.add(answerRecord);
        }
    }
    //手机省外打电话
    public void addMoveCallingInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            MoveCallingInLandRecords.add(answerRecord);
        }
    }
    
    
    public void addSendMessageRecords(CallRecord answerRecord) {
        
    }
    public void addReceiveMessageRecords(CallRecord answerRecord) {
        
    }
    public void addSendMessageRecords(MessageRecord sendMessageRecord) {
        
    }
    public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
        
    }
    public ArrayList<MessageRecord> getSendMessageRecords(){
        return receiveMessageRecords;
        
    }
    public ArrayList<MessageRecord> getReceiveMessageRecords(){
        return receiveMessageRecords;
        
    }
    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;
        
    }

}

 

 

2.3 第三次大作业

第三次大作业与前两次大作业的联系性并不大。将其视作一个独立的题目也无伤大雅。本题需要注意的就是短信的条数。每10个字符算一条短信。在理解这一点后本题就没有什么难度了。

代码如下:

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ArrayList<User> U = new ArrayList<User>();
        ArrayList<CallRecord> C = new ArrayList<CallRecord>();
        ArrayList<MessageRecord> M = new ArrayList<MessageRecord>();
        Scanner in = new Scanner(System.in);
        IsDate is = new IsDate();
        LandlinePhoneCharging charge = new LandlinePhoneCharging();
        MoveCharging charge1 = new MoveCharging();
        MessageC charge2 = new MessageC();
        while(true) {
            String str = in.nextLine();
            if(str.matches("u-0791[0-9]{7,8}[ ]0")||str.matches("u-1[0-9]{10}[ ]1")||str.matches("u-1[0-9]{10}[ ]3")) {
                User use= new User();
                String[] x = str.split(" ");
                String str1=x[0].substring(2, x[0].length());
                use.setNumber(str1);
                int b = Integer.parseInt(x[1]);
                use.setNumber1(b);
                U.add(use);
            }            
            //发短信
            else if (str.matches("m-1[0-9]{10}[ ]1[0-9]{10}[ ](([0-9]+|[a-z]+|[A-Z]+)|(,|[.])|[ ])+")) {
                MessageRecord message = new MessageRecord();
                String[] x = str.split(" ",3);
                String a=x[0];
                String str3=a.substring(2,a.length());
                message.setCallingNumber(str3);
                int b = x[2].length();
                message.setMessage(x[2]);
                message.setNumber(b);
                M.add(message);
            }
            else if(str.matches("end")) {
                break;
            }
        }
            for (int i = 0; i < U.size(); i++) {
                for (int j = 0; j < U.size(); j++) {
                    if (i != j && U.get(i).getNumber().equals(U.get(j).getNumber())) {
                        U.remove(U.get(j));
                    }
                }
            }
        for(int i=0;i<U.size();i++) {
            for(int j=0;j<M.size();j++) {
                if(U.get(i).getNumber().equals(M.get(j).getCallingNumber())) {
                    U.get(i).userRecord.addSendMessageRecords(M.get(j));
                }
            }
        }
        Collections.sort(U, new MyComparatorToUser());
        for(int i=0;i<U.size();i++) {
            if(U.get(i).getNumber1()==3&&i<U.size()-1) {
                double a = OutFormat.doubleFormat( charge2.cal(U.get(i).userRecord));
                System.out.println(U.get(i).getNumber()+" "+ a +" "+(100-a));
            }
            if(U.get(i).getNumber1()==3&&i==U.size()-1) {
                double a = OutFormat.doubleFormat( charge2.cal(U.get(i).userRecord));
                System.out.print(U.get(i).getNumber()+" "+ a +" "+(100-a));
            }
        }
}
static    class MyComparatorToUser implements Comparator<User>{
    @Override
    public int compare(User u1, User u2) {
        double p = Double.parseDouble(u1.number);
        double q = Double.parseDouble(u2.number);
        if(u1.number.charAt(0)=='0'&&u2.number.charAt(0)=='0') {
            return (int)(p-q);
        }
        if(u1.number.charAt(0)=='0') {
            p=0;
        }
        if(u2.number.charAt(0)=='0') {
            q=0;
        }
        return (int)(p-q);
    }
}
}
abstract class CallChargeRule extends ChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        return 0;
    }
}
class CallRecord extends CommunicationRecord{
    Date startTime;
    Date endTime;
    String callingAddressAreaCode;
    String answerAddressAreaCode;
    SimpleDateFormat a = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    SimpleDateFormat b = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss");
    public Date getStartTime() {
        return startTime;
    }
    public void setStartTime(String startTime) {
        try {
            this.startTime =  b.parse(startTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    public Date getEndTime() {
        return endTime;
    }
    public void setEndTime(String endTime) {
        try {
            this.endTime =  a.parse(endTime);
        } catch (ParseException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }
    public void setCallingAddressAreaCode(String callingNumber) {
        this.callingAddressAreaCode=callingNumber.substring(2, 6);
    }
    public void setCallingAddressAreaCodeshouji(String callingNumber) {
        this.callingAddressAreaCode=callingNumber;
    }
    public String getAnswerAddressAreaCode() {
        return answerAddressAreaCode;
    }
    public void setAnswerAddressAreaCodeshouji(String answerNumber) {
        this.answerAddressAreaCode = answerNumber;
    }
    public void setAnswerAddressAreaCode(String answerNumber) {
        this.answerAddressAreaCode = answerNumber.substring(0, 4);
    }
    public int Time() {
         Date fromDate3 = startTime;
         Date toDate3 = endTime;
         if(fromDate3!=null&&toDate3!=null) {
             long from3 = fromDate3.getTime();  
             long to3 = toDate3.getTime();  
             int seconds = (int) ((to3 - from3) / (1000));
             if(seconds%60==0&&seconds>0) {
                 return seconds/60;
             }
             if(seconds%60!=0&&seconds>0) {
                 return seconds/60+1;
             }
             else {
                 return 0;
             }
         }
         else {
             return 0;
         }
    }
}
abstract class ChargeMode {
    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 {
    String callingNumber;
    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 IsDate {
    public static boolean isDate(String str_input,String rDateFormat){
        if (!isNull(str_input)) {
                 SimpleDateFormat formatter = new SimpleDateFormat(rDateFormat);
                 formatter.setLenient(false);
                 try {
                     formatter.format(formatter.parse(str_input));
                 } catch (Exception e) {
                     return false;
                 }
                 return true;
             }
        return false;
        }
        public static boolean isNull(String str){
        if(str==null)
        return true;
        else
        return false;
        }
}
class LandAnswerInCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandAnswerInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandAnswerInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;
    @Override
    public double calCost(UserRecords userRecords) {
        LandPhoneInCityRule a = new LandPhoneInCityRule();
        LandPhoneInProvinceRule b = new LandPhoneInProvinceRule();
        LandPhoneInlandRule c = new LandPhoneInlandRule();
        LandAnswerInCity d = new LandAnswerInCity();
        LandAnswerInland e = new LandAnswerInland();
        LandAnswerInProvince f = new LandAnswerInProvince();
        return a.calCost(userRecords.getAnswerInCityRecords())+b.calCost(userRecords.getAnswerInProvinceRecords())+c.calCost(userRecords.getAnswerInLandRecords())+
                d.calCost(userRecords.getAnswerInCityRecords())+e.calCost(userRecords.getAnswerInLandRecords())+f.calCost(userRecords.getAnswerInProvinceRecords());
    }
    @Override
    public double getMonthlyRent() {
        return monthlyRent;
    }
}
class LandPhoneInCityRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.1;
        }
        return sum;
    }
}
class LandPhoneInlandRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.6;
        }
        return sum;
    }
}
class LandPhoneInProvinceRule extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MessageC {
    public double cal(UserRecords userRecords) {
        MessageCharge me = new MessageCharge();
        return me.calCost(userRecords.getSendMessageRecords());
    }
}
class MessageCharge{
    public double calCost(ArrayList<MessageRecord> sendMessageRecords) {
        int number=0;
        double sum=0;
        for(int i=0;i<sendMessageRecords.size();i++) {
            number=number+sendMessageRecords.get(i).getnumber();
        }
        if(number<=3) {
            sum=number*0.1;
        }
        if(number>3&&number<=5) {
            sum=(number-3)*0.2+0.3;
        }
        if(number>5) {
            sum=(number-5)*0.3+0.7;
        }
        return sum;
    }
}
class MessageRecord extends CommunicationRecord{
    String message;
    int number;
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public int getnumber() {
        return number;
    }
    public void setNumber(int number) {
        if(number%10!=0) {
        this.number=number/10+1;
        }
        if(number%10==0) {
            this.number=number/10;
        }
    }

}
class MoveAnswerInCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class MoveAnswerInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MoveAnswerInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        return sum;
    }
}
class MoveCharging extends ChargeMode{
    public double cal(UserRecords userRecords) {
    MoveAnswerInCity a = new MoveAnswerInCity();
    MoveAnswerInland b = new MoveAnswerInland();
    MoveAnswerInProvince c = new MoveAnswerInProvince();
    MovePhonefromCitytoCity d = new MovePhonefromCitytoCity();
    MovePhonefromCitytoland e = new MovePhonefromCitytoland();
    MovePhonefromCitytoProvince f = new MovePhonefromCitytoProvince();
    MovePhoneInland g = new MovePhoneInland();
    MovePhoneInProvince h = new MovePhoneInProvince();
    return a.calCost(userRecords.getMoveanswerInCityRecords())+b.calCost(userRecords.getMoveanswerInLandRecords())+
            c.calCost(userRecords.getMoveanswerInProvinceRecords())+d.calCost(userRecords.getMoveCallingfromCitytoCityRecords())+
            e.calCost(userRecords.getMoveCallingfromCitytoLandRecords())+f.calCost(userRecords.getMoveCallingfromCitytoProvinceRecords())+
            g.calCost(userRecords.getMoveCallingInLandRecords())+h.calCost(userRecords.getMoveCallingInProvinceRecords());
    }
}
class MovePhonefromCitytoCity extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.1;
        }
        return sum;
    }
}
class MovePhonefromCitytoland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class MovePhonefromCitytoProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.2;
        }
        return sum;
    }
}
class MovePhoneInland extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.6;
        }
        return sum;
    }
}
class MovePhoneInProvince extends CallChargeRule{
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i<callRecords.size();i++) {
            sum=sum+callRecords.get(i).Time()*0.3;
        }
        return sum;
    }
}
class OutFormat {
        public static Double doubleFormat(double b) {
            DecimalFormat df = new DecimalFormat("#.00");
            Double output = Double.valueOf(df.format(b));
            return output;
        }
    }
class User {
    UserRecords userRecord = new UserRecords();
    double balance = 100;
    ChargeMode chargeMode;
    String number;
    int number1;
    public double callBalance() {
        return balance-calCost();
    }
    public double calCost() {
        return chargeMode.calCost(userRecord);
    }
    public UserRecords getUserRecords() {
        return userRecord;
    }
    public void setUserRecords(UserRecords userRecords) {
        this.userRecord=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;
    }
    public int getNumber1() {
        return number1;
    }
    public void setNumber1(int number1) {
        this.number1=number1;
    }
}
class UserRecords {
    public ArrayList<CallRecord> getMoveanswerInLandRecords() {
        return MoveanswerInLandRecords;
    }
    public ArrayList<CallRecord> getMoveanswerInProvinceRecords() {
        return MoveanswerInProvinceRecords;
    }
    public ArrayList<CallRecord> getMoveanswerInCityRecords() {
        return MoveanswerInCityRecords;
    }
    public ArrayList<CallRecord> getMoveCallingfromCitytoLandRecords() {
        return MoveCallingfromCitytoLandRecords;
    }
    public ArrayList<CallRecord> getMoveCallingfromCitytoProvinceRecords() {
        return MoveCallingfromCitytoProvinceRecords;
    }
    public ArrayList<CallRecord> getMoveCallingfromCitytoCityRecords() {
        return MoveCallingfromCitytoCityRecords;
    }
    public ArrayList<CallRecord> getMoveCallingInProvinceRecords() {
        return MoveCallingInProvinceRecords;
    }
    public ArrayList<CallRecord> getMoveCallingInLandRecords() {
        return MoveCallingInLandRecords;
    }
    ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveanswerInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveanswerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveanswerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingfromCitytoCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> MoveCallingInLandRecords = new ArrayList<CallRecord>();
    ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
    ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
    public void addCallingInCityRecords(CallRecord callRecord) {
        if(callRecord.getCallingAddressAreaCode().equals("0791")) {
            callingInCityRecords.add(callRecord);
        }
    }
    public void addCallingInProvinceRecords(CallRecord callRecord) {
        String a = callRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                callingInProvinceRecords.add(callRecord);
            }
        }
        }
        if(b==701) {
            callingInProvinceRecords.add(callRecord);
        }
    }
    public void addCallingInLandRecords(CallRecord callRecord) {
        String a = callRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            callingInLandRecords.add(callRecord);
        }
    }
    public void addAnswerInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
            answerInCityRecords.add(answerRecord);
        }
    }
    public void addAnswerInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                answerInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            answerInProvinceRecords.add(answerRecord);
        }
    }
    public void addAnswerInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            answerInLandRecords.add(answerRecord);
        }
    }
    public void addMoveanswerInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
            MoveanswerInCityRecords.add(answerRecord);
        }
    }
    public void addMoveanswerInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                MoveanswerInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            MoveanswerInProvinceRecords.add(answerRecord);
        }
    }
    public void addMoveanswerInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getAnswerAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            MoveanswerInLandRecords.add(answerRecord);
        }
    }
    public void addMoveCallingInCityRecords(CallRecord answerRecord) {
        if(answerRecord.getCallingAddressAreaCode().equals("0791")) {
            if(answerRecord.getAnswerAddressAreaCode().equals("0791")) {
                MoveCallingfromCitytoCityRecords.add(answerRecord);
            }
            else if(answerRecord.getAnswerAddressAreaCode().equals("0790")||
                answerRecord.getAnswerAddressAreaCode().equals("0792")||answerRecord.getAnswerAddressAreaCode().equals("0793")||
                answerRecord.getAnswerAddressAreaCode().equals("0794")||answerRecord.getAnswerAddressAreaCode().equals("0795")||
                answerRecord.getAnswerAddressAreaCode().equals("0796")||answerRecord.getAnswerAddressAreaCode().equals("0797")||
                answerRecord.getAnswerAddressAreaCode().equals("0798")||answerRecord.getAnswerAddressAreaCode().equals("0799")||
                answerRecord.getAnswerAddressAreaCode().equals("0701")) {
                MoveCallingfromCitytoProvinceRecords.add(answerRecord);
            }
            else {
                MoveCallingfromCitytoLandRecords.add(answerRecord);
            }
        }
    }
    public void addMoveCallingInProvinceRecords(CallRecord answerRecord) {
        String a = answerRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if(b!=791) {
        for(int i=790;i<800;i++) {
            if(b==i) {
                MoveCallingInProvinceRecords.add(answerRecord);
            }
        }
        }
        if(b==701) {
            MoveCallingInProvinceRecords.add(answerRecord);
        }
    }
    public void addMoveCallingInLandRecords(CallRecord answerRecord) {
        String a = answerRecord.getCallingAddressAreaCode();
        int b = Integer.parseInt(a);
        if((b<790||b>799)&&b!=701) {
            MoveCallingInLandRecords.add(answerRecord);
        }
    }
    public void addSendMessageRecords(CallRecord answerRecord) {    
    }
    public void addReceiveMessageRecords(CallRecord answerRecord) {    
    }
    public void addSendMessageRecords(MessageRecord sendMessageRecord) {
        sendMessageRecords.add(sendMessageRecord);
    }
    public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {    
    }
    public ArrayList<MessageRecord> getSendMessageRecords(){
        return sendMessageRecords;
    }
    public ArrayList<MessageRecord> getReceiveMessageRecords(){
        return receiveMessageRecords;
    }
    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;     
    }
}

 

 3.踩坑心得

3.1:由于userrecord数组太多,在存储时需要看清每个数组的名称,不要写错了,一旦写错了,就很难发现。

3.2:这几次大作业计算都不难。难的是要理清各个类之间的关系以及输入与数组的关系。

3.3:在第一次大作业排序时,我用的是hashmap,但是这个排序有一个致命的问题,那就是当月租不同时,余额的计算会出现错误。

3.4:在确定号码的区号时,要特别注意区分手机与座机的区别。

3.5:在计算时间和划分短信个数时,要注意存余,如果余数不为0,则需要在余数上加一。

4.改进建议

我在计算手机,座机话费时,额外添加了较多的userrecord数组,虽然很清晰明了,但是不够简便,我希望能够简化代码

在计算费用时,我并没有使用chargeMode类,而是越过chargeMode类直接调用了charge类(计算费用),这样显然不符合设计原则。我希望可以将费用类放在一个类内。

5.总结

类图对代码的实现尤为重要。我们可以在编写代码前先实现类图,然后根据类图实现代码。同时我们在编写代码时需要考虑到未来的规划,比如添加新功能,实现新方法。因此我们的代码需要有足够的扩展性。

posted on 2022-06-10 14:07  叽里咕噜帅  阅读(29)  评论(0)    收藏  举报

导航