BLOG-3

一、前言

  作业六考察了多态,接口,还有抽象方法。

  作业七考察了基本语法的使用和迭代器的基本使用。

  作业八考察了内部类与多态。

      这段时间做的题目相对与之前图形题目简单,难度适中,有利于我们巩固基础。

二、设计与分析

 三次pta均有电信计费问题,电信计费问题输出需要排序,用户用集合存储,集合自带sort函数可以进行排序,但是User类不属于基本类型,所以对代码进行操作使之排序

 方法一:

  由于集合里是User类,可以是User实现接口Comparable,然后重写compareTo方法

@Override
    public int compareTo(Object o) {
        User s=(User)o;
        if(this.number.compareTo(s.getNumber())>0)
            return 1;
         else
             return -1;
    }

  Collections.sort(users),通过Collections.sort排序,users是排序容器对象。

方法二:

  调用Collections.sort()时,写一个匿名内部类,从而实现排序。

Collections.sort(users, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {

                if(o1.getNumber().compareTo(o2.getNumber())>0)
                    return 1;
                else
                    return -1;
            }
        });

三、踩坑心得

 6-1:电信计费题目逐层深入,记录电话通信时有市内,省内,国内,第一次由于只有座机打座机,误以为通信电话纪律是记录在打在什么地方,记录在什么位置,但是第二次时,这种思想会导致通话记录的容器不足,还有增加容器记录省内打给其他地方和饥饿省外打给其他地方,这样会大大增加代码量。后来才发现通话记录记录的是打电话的位置,通过打电话的位置来记录通话信息,这样只要三个容器就够。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
    public static void main(String[] args) throws ParseException {
        int j=0;
        Scanner sc=new Scanner(System.in);
        String userbegan;
        String landline="u-(0791(\\d{7,8})) 0";
        String phone="u-(1\\d{10}) 1";
        String number;
        String m2="t-(0(\\d{9,11})) (0\\d{9,11})";//匹配的打电话的电话号码
        String time="(\\d+\\.([1-9]|(1[0-2]))\\.(([1-9])|([1-2][0-9])|(31)) (0[0-9]|(1[0-9])|(2[0-4])):([0-5][0-9]):[0-5][0-9]) (\\d+\\.([1-9]|(1[0-2]))\\.(([0-9])|([1-2][0-9])|(31)) (0[0-9]|(1[0-9])|(2[0-4])):([0-5][0-9]):[0-5][0-9])";
        String l_p="t-(0\\d{9,11}) (1\\d{10}) (0\\d{2,3})";//座机打手机
        String p_p="t-(1\\d{10}) (0\\d{2,3}) (1\\d{10}) (0\\d{2,3})";
        String p_l="t-(1\\d{10}) (0\\d{2,3}) (0\\d{9,11})";
        User user;
        userbegan=sc.nextLine();//用户信息
        ArrayList<User> users=new ArrayList<User>();
        while(!userbegan.equals("end")) {         //初始化用户
            boolean mark = true;
            Pattern p2=Pattern.compile(m2);//座机配对
            Pattern p3=Pattern.compile(time);//座机配对
            Matcher matcher2= p2.matcher(userbegan);
            Matcher matcher3= p3.matcher(userbegan);

            Pattern consumerl = Pattern.compile(landline);//配对初始化用户  座机打座机
            Pattern consumerp = Pattern.compile(phone);//配对初始化用户
            Matcher matcheruse1 = consumerl.matcher(userbegan);
            Matcher matcheruse2 = consumerp.matcher(userbegan);

            Pattern p = Pattern.compile(l_p);//配对初始化用户    座机打手机
            Pattern p1 = Pattern.compile(time);//配对初始化用户
            Matcher m = p.matcher(userbegan);
            Matcher m1 = p1.matcher(userbegan);

            Pattern p4 = Pattern.compile(p_p);//配对初始化用户    手机打手机
            Pattern p5 = Pattern.compile(time);//配对初始化用户
            Matcher m4 = p4.matcher(userbegan);
            Matcher m5 = p5.matcher(userbegan);

            Pattern p6 = Pattern.compile(p_l);//配对初始化用户    手机打座机
            Pattern p7 = Pattern.compile(time);//配对初始化用户
            Matcher m6 = p6.matcher(userbegan);
            Matcher m7 = p7.matcher(userbegan);

            if (matcheruse1.find()) {//座机电话配对
                if(!matcheruse1.matches()){//存在但是匹配不完全,
                    userbegan= sc.nextLine();
                    continue;
                }

                number=matcheruse1.group(1);
                user=new User(number,0);
                for (User i:users) {
                    if(i.getNumber().equals(number)){
                        mark=false;//重复就不加入
                        break;
                    }
                }
                if(mark){//没包含就加入
                    users.add(user);
                }
            }//录座机用户
            else if (matcheruse2.find()) {//手机电话配对
                if(!matcheruse2.matches()){//存在但是匹配不完全,
                    userbegan= sc.nextLine();
                    continue;
                }

                number=matcheruse2.group(1);
                user=new User(number,1);
                for (User i:users) {
                    if(i.getNumber().equals(number)){
                        mark=false;//重复就不加入
                        break;
                    }
                }
                if(mark){//没包含就加入
                    users.add(user);
                }
            }//录手机用户
            else if(matcher2.find()&&matcher3.find()){//座机打座机
                String n=matcher2.group(0)+" "+matcher3.group(0);
                if(!userbegan.equals(n)){
                    userbegan= sc.nextLine();
                    continue;
                }
                String zcall=matcher2.group(1);
                String bcall=matcher2.group(3);

                Date date1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(matcher3.group(1));
                Date date2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(matcher3.group(12));
                CallRecord callRecord=new CallRecord(zcall,bcall,date1,date2,zcall.substring(0,4),bcall.substring(0,4));


                for(int i=0;i<users.size();i++){
                    User operuser=users.get(i);
                    if(users.get(i).getNumber().equals(zcall)){//找到配对对象
                        String area =bcall.substring(0,3);//通过被打电话人的地方确定
                        if(area.equals("079")||bcall.substring(0,4).equals("0701")) {//在江西省内
                            if(bcall.substring(0,4).equals("0791")){//在南昌市打电话给南昌市
                                operuser.getUserRecords().addCallingInCityRecords(callRecord);
                            }else{//打电话在江西省内
                                operuser.getUserRecords().addCallingInProvinceRecords(callRecord);
                            }
                        }else{
                            operuser.getUserRecords().addCallingInLandRecords(callRecord);
                        }
                    }
                }
                //说明输入结束
            }//座机打座机
            else if(m.find()&&m1.find()){//座机打手机
                String n=m.group(0)+" "+m1.group(0);
                /*
                *   t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
                *   t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
                */
                if(!n.equals(userbegan)){
                    userbegan= sc.nextLine();
                    continue;
                }
                String zcall=m.group(1);
                String bcall=m.group(2);
                String numcode=m.group(3);
                Date datestart = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m1.group(1));
                Date dateend = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m1.group(12));
                CallRecord callRecord=new CallRecord(zcall,bcall,datestart,dateend,"0791",numcode);
                User dcall =null;
                User acall=null;
                for(int i=0;i<users.size();i++){
                    user=users.get(i);
                    if(user.getNumber().equals(zcall)){
                        dcall=user;
                    }
                    if(user.getNumber().equals(bcall)){
                        acall=user;
                    }
                }
                if(numcode.substring(0,3).equals("079")||numcode.equals("0701")){
                    if(numcode.equals("0791")){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInCityRecords(callRecord);
                    }else{
                        if(dcall!=null)
                             dcall.getUserRecords().addCallingInProvinceRecords(callRecord);
                    }
                }else{
                    if(dcall!=null)
                        dcall.getUserRecords().addCallingInLandRecords(callRecord);
                    if(acall!=null)
                        acall.getUserRecords().addCallingInLandRecords(callRecord);
                }

            }     //座机打手机
            else if(m4.find()&&m5.find()){
                String n=m4.group(0)+" "+m5.group(0);
                /*   手机打手机
                 *   t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
                 *   t-(1\d{10}) (0\d{2,3}) (1\d{10}) (0\d{2,3})
                 */
                if(!n.equals(userbegan)){
                    userbegan= sc.nextLine();
                    continue;
                }
                String zcall=m4.group(1);
                String bcall=m4.group(3);
                String zcallcode=m4.group(2);
                String bcallcode=m4.group(4);
                Date datestart = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m5.group(1));
                Date dateend = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m5.group(12));
                CallRecord callRecord=new CallRecord(zcall,bcall,datestart,dateend,zcallcode,bcallcode);
                User dcall =null;
                User acall=null;
                for(int i=0;i<users.size();i++){
                    user=users.get(i);
                    if(user.getNumber().equals(zcall)){
                        dcall=user;
                    }
                    if(user.getNumber().equals(bcall)){
                        acall=user;
                    }
                }
                if(zcallcode.substring(0,3).equals("079")||zcallcode.equals("0701")){//省内开始打电话
                    if(zcallcode.equals("0791")&&bcallcode.equals("0791")){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInCityRecords(callRecord);
                    }else if(zcallcode.equals("0791")&&(bcallcode.substring(0,3).equals("079")||bcallcode.equals("0701"))){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInProvinceRecords(callRecord);//省内打电话
                    }
                    else if(zcallcode.equals("0791")){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInLandRecords(callRecord);//市内打省外电话
                    }else{
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingroveInProvinceRecords(callRecord);//省内漫游
                    }
                }else{
                    if(dcall!=null)
                        dcall.getUserRecords().addCallingroveInLandRecords(callRecord);//省外漫游
                }
                if(bcallcode.substring(0,3).equals("079")||bcallcode.equals("0701")){
                    if(zcallcode.equals("0791")){
                      ;
                    }
                }else{
                    if(acall!=null)
                        acall.getUserRecords().addCallingInLandRecords(callRecord);
                }

            }//手机打手机
            else if(m6.find()&&m7.find()) {//手机打座机
                String n=m6.group(0)+" "+m7.group(0);
                /*   手机打座机
                    t-13986300001 0391 079186300001 2022.12.31 23:50:25 2023.1.1 00:05:11
                 *   t-(1\d{10}) (0\d{2,3}) (0\d{10,11})
                 */
                if(!n.equals(userbegan)){
                    userbegan= sc.nextLine();
                    continue;
                }
                String zcall=m6.group(1);
                String bcall=m6.group(3);
                String zcallcode=m6.group(2);
                String bcallcode=m6.group(3).substring(0,4);
                Date datestart = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m7.group(1));
                Date dateend = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(m7.group(12));
                CallRecord callRecord=new CallRecord(zcall,bcall,datestart,dateend,zcallcode,"0791");
                User dcall =null;
                for(int i=0;i<users.size();i++){
                    user=users.get(i);
                    if(user.getNumber().equals(zcall)){
                        dcall=user;
                    }
                }
                if(zcallcode.substring(0,3).equals("079")||zcallcode.equals("0701")){
                    if(zcallcode.equals("0791")&&bcallcode.equals("0791")){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInCityRecords(callRecord);//市内打给市内
                    }else if(zcallcode.equals("0791")&&(bcallcode.substring(0,3).equals("079")||bcallcode.equals("0701"))){
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInProvinceRecords(callRecord);//市内打给省内
                    }else if(zcallcode.equals("0791")){//市内打给省外
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingInLandRecords(callRecord);//市内打给省外
                    }else{
                        if(dcall!=null)
                            dcall.getUserRecords().addCallingroveInProvinceRecords(callRecord);//省内漫游
                    }
                }else{
                    if(dcall!=null)
                        dcall.getUserRecords().addCallingroveInLandRecords(callRecord);//省外漫游
                }


            }//手机打座机
            userbegan=sc.nextLine();
        }
        Collections.sort(users);
        for(int i=0;i<users.size();i++){
            user=users.get(i);
            double a=user.calCost();
            a=(int )((a+0.099)*10)/10.0;
            if(user.getNumber().charAt(0)=='0')
                System.out.println(user.getNumber()+" "+a+" "+(80.0 - a));
            else
                System.out.println(user.getNumber()+" "+a+" "+(85.0 - a));
        }
    }
}
abstract class CallChargeRule extends ChargeRule {
    public abstract double calCost(ArrayList<CallRecord> callRecords);
}
class CallRecord extends CommunicationRecord {
    private Date startTime;
    private Date endTime;
    private String callingAddressAreaCode;
    private String answerAddressAreaCode;

    public CallRecord() {

    }

    public CallRecord(String callingNumber, String answerNumber, Date startTime, Date endTime, String callingAddressAreaCode, String answerAddressAreaCode) {
        super(callingNumber, answerNumber);
        this.startTime = startTime;
        this.endTime = endTime;
        this.callingAddressAreaCode = callingAddressAreaCode;
        this.answerAddressAreaCode = answerAddressAreaCode;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    public String getCallingAddressAreaCode() {
        return callingAddressAreaCode;
    }

    public void setCallingAddressAreaCode(String callingAddressAreaCode) {
        this.callingAddressAreaCode = callingAddressAreaCode;
    }

    public String getAnswerAddressAreaCode() {
        return answerAddressAreaCode;
    }

    public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
        this.answerAddressAreaCode = answerAddressAreaCode;
    }
}
class ChargeMode {
    private ArrayList<ChargeRule> chargeRules= new ArrayList<ChargeRule>();

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

    public void setChargeRules(ChargeRule chargeRules) {
        this.chargeRules.add(chargeRules);//添加规则
    }
    public double calCost(UserRecords useRecords){
        double sum=0;
        LandPhoneInCityRule cha1=(LandPhoneInCityRule)chargeRules.get(0);
        LandPhoneInProvinceRule cha2=(LandPhoneInProvinceRule)chargeRules.get(1);
        LandPhoneInlandRule cha3=(LandPhoneInlandRule)chargeRules.get(2);
        sum=sum+cha1.calCost(useRecords.getCallingInCityRecords())*0.1;
        sum=sum+cha2.calCost(useRecords.getCallingInProvinceRecords())*0.3;
        sum=sum+cha3.calCost(useRecords.getCallingInLandRecords())*0.6;
        return sum;
    }
    public double getMonthlyRent(){
        return 0.0;
    }

}
abstract class ChargeRule {
//    public abstract double calCost(ArrayList<CallRecord> callRecords);

}
abstract class CommunicationRecord {
    protected String callingNumber;
    protected String answerNumber;

    public CommunicationRecord() {
    }

    public CommunicationRecord(String callingNumber, String answerNumber) {
        this.callingNumber = callingNumber;
        this.answerNumber = 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 useRecords){
        double sum=0;
        LandPhoneInCityRule cha1=(LandPhoneInCityRule)getChargeRules().get(0);
        LandPhoneInProvinceRule cha2=(LandPhoneInProvinceRule)getChargeRules().get(1);
        LandPhoneInlandRule cha3=(LandPhoneInlandRule)getChargeRules().get(2);
        sum=sum+cha1.calCost(useRecords.getCallingInCityRecords())*0.1;
        sum=sum+cha2.calCost(useRecords.getCallingInProvinceRecords())*0.2;
        sum=sum+cha3.calCost(useRecords.getCallingInLandRecords())*0.3;
        sum=sum+cha3.calCost(useRecords.getCallingroveInProvinceRecords())*0.3;//省内漫游
        sum=sum+cha3.calCost(useRecords.getCallingroveInLandRecords())*0.6;//国内漫游
        sum=sum+cha3.calCost(useRecords.getAnswerInLandRecords())*0.3;//省外漫游接听
        return sum;
    }
    public double getMonthlyRent(){
        return 0.0;
    }
}
class LandPhoneInCityRule extends CallChargeRule {
    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i< callRecords.size();i++){
            CallRecord callrecord=callRecords.get(i);
            long a=(long)((callrecord.getEndTime().getTime()-callrecord.getStartTime().getTime())/1000.0/60.0+0.99999);
            sum=sum+a;
        }
        return sum;
    }
}
class LandPhoneInlandRule extends CallChargeRule {
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i< callRecords.size();i++){
            CallRecord callrecord=callRecords.get(i);
            long a=(long)((callrecord.getEndTime().getTime()-callrecord.getStartTime().getTime())/1000.0/60.0+0.99999);
            sum=sum+a;
        }
        return sum;
    }
}
class LandPhoneInProvinceRule extends CallChargeRule {
    public double calCost(ArrayList<CallRecord> callRecords) {
        double sum=0;
        for(int i=0;i< callRecords.size();i++){
            CallRecord callrecord=callRecords.get(i);
            long a=(long)((callrecord.getEndTime().getTime()-callrecord.getStartTime().getTime())/1000.0/60.0+0.99999);
            sum=sum+a;
        }
        return sum;
    }
}
abstract class MessageChargeRule extends ChargeRule {
    public double calCost(ArrayList<MessageRecord> message1records){

        return 0.0;
    }


}
class MessageRecord extends CommunicationRecord {
    private String message;

    public MessageRecord() {
    }

    public MessageRecord(String callingNumber, String answerNumber, String message) {
        super(callingNumber, answerNumber);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
class SendMessageRule extends MessageChargeRule{
    @Override
    public double calCost(ArrayList<MessageRecord> message1records){

        return 0.0;
    }

}
class User implements Comparable{
    private double balance=100;
    private String number;

    private ChargeMode chargeMode;
    private UserRecords userRecords=new UserRecords();
    private int mod=0;    //先放在过渡??????
    User(){

    }
    User(String number,int num){
        this.number=number;
        this.mod=num;
    }
    public double calBalance(){
        return 0;
    }
    public double calCost(){//目前只计算打电话费用
        if(this.mod==0) {//座机
            chargeMode=new ChargeMode();
            chargeMode.setChargeRules(new LandPhoneInCityRule());
            chargeMode.setChargeRules(new LandPhoneInProvinceRule());
            chargeMode.setChargeRules(new LandPhoneInlandRule());
            return chargeMode.calCost(this.userRecords);
        }else{//手机收费
            chargeMode=new LandlinePhoneCharging();
            chargeMode.setChargeRules(new LandPhoneInCityRule());
            chargeMode.setChargeRules(new LandPhoneInProvinceRule());
            chargeMode.setChargeRules(new LandPhoneInlandRule());
            return chargeMode.calCost(this.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 UserRecords getUserRecords() {
        return userRecords;
    }

    public void setUserRecords(UserRecords userRecords) {
        this.userRecords = userRecords;
    }
    @Override
    public int compareTo(Object o) {
        User s=(User)o;
        if(this.number.compareTo(s.getNumber())>0)
            return 1;
         else
             return -1;
    }

}
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>answerInCityRecoreds=new ArrayList<CallRecord>();
    private ArrayList<CallRecord>answerInProvinceRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord>answerInLandRecords=new ArrayList<CallRecord>();
    private ArrayList<MessageRecord>sendMessageRecords=new ArrayList<MessageRecord>();
    private ArrayList<MessageRecord>receiveMessageRecords=new ArrayList<MessageRecord>();
    private ArrayList<CallRecord>callingroveInProvinceRecords=new ArrayList<CallRecord>();
    private ArrayList<CallRecord>callingroveInLandRecords=new ArrayList<CallRecord>();


    public ArrayList<CallRecord> getCallingroveInProvinceRecords() {
        return callingroveInProvinceRecords;
    }

    public void addCallingroveInProvinceRecords(CallRecord callingroveInProvinceRecords) {
        this.callingroveInProvinceRecords.add(callingroveInProvinceRecords);
    }

    public ArrayList<CallRecord> getCallingroveInLandRecords() {
        return callingroveInLandRecords;
    }

    public void addCallingroveInLandRecords(CallRecord callingroveInLandRecords) {
        this.callingroveInLandRecords.add(callingroveInLandRecords);
    }

    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> getAnswerInCityRecoreds() {

        return answerInCityRecoreds;
    }

    public void addAnswerInCityRecoreds(CallRecord answerInCityRecoreds) {
        this.answerInCityRecoreds.add(answerInCityRecoreds);
    }

    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<MessageRecord> getSendMessageRecords() {
        return sendMessageRecords;
    }

    public void addSendMessageRecords(MessageRecord sendMessageRecords) {
        this.sendMessageRecords.add(sendMessageRecords);
    }

    public ArrayList<MessageRecord> getReceiveMessageRecords() {
        return receiveMessageRecords;
    }

    public void addReceiveMessageRecords(MessageRecord receiveMessageRecords) {
        this.receiveMessageRecords.add(receiveMessageRecords);
    }

}

 

  电信通话有输入时间会有问题例,一共只有12个月,天数不能超过31天,不能超过24个小时,不能超过60分钟,本以为用了SimpleDateFormat()如果输入时间问题着则会报错,但是输入像

2002.13.32 13: 25:61也不会报错,这里有问题,导致找了好久。

 Date date1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(matcher3.group(1));

  所以最好还是用正则表达式来配对

        String m3="(\\d+\\.([1-9]|(1[0-2]))\\.(\\d+) (0[0-9]|(1[0-9])|(2[0-4])):([0-5][0-9]):[0-5][0-9]) (\\d+\\.([1-9]|(1[0-2]))\\.(\\d+) (0[0-9]|(1[0-9])|(2[0-4])):
([0-5][0-9]):[0-5][0-9])";

虽然正则表达式有点长但是用起来还是方便

输入可能配对,但是可能还会有更长,所以要确定是输入的与配对的完全一样

    if(!matcher1.matches()){
       userbegan= sc.nextLine();
       continue;
       }

计算费用的时候也是一条通话记录一条通话记录的计算,不是计算所有的通话记录时长在算费用。

计算时向上取整

            long a=(long)((callrecord.getEndTime().getTime()-callrecord.getStartTime().getTime())/1000/60.0+0.99999);

 

  6-2:考察文档为多态与接口,接口里的变量默认为静态的,接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的,也可以将方法设置为静态的,实现了接口,就要重新接口里的非静态方法。

import java.util.Scanner;
public class Main {
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int i=0;
        int n=sc.nextInt();
        Container c[]=new Container[n];
        for(i=0;i<n;i++){
            String tpye=sc.next();
            if(tpye.equals("cube")){
                double a=sc.nextDouble();
                c[i]=new Cube(a);
            }else{
                double a=sc.nextDouble();
                double b=sc.nextDouble();
                c[i]=new Cylinder(a,b);
            }
        }
        System.out.printf("%.2f\n",Container.sumofArea(c));
        System.out.printf("%.2f",Container.sumofVolume(c));
    }
}
interface Container {
    public static final double pi=3.1415926;
    public abstract double area();
    public abstract double volume();
    static double sumofArea(Container c[]){
      double sum=0;
        for(int  i=0;i< c.length;i++){
            Container a=c[i];
          sum=sum+a.area();
      }
        return sum;
    }
    static double sumofVolume(Container c[]){
        double sum=0;
        for(int  i=0;i< c.length;i++){
            Container a=c[i];
            sum=sum+a.volume();
        }
        return sum;
    }
}
class Cube implements Container{
    double a;

    public Cube(double a) {
        this.a = a;
    }

    @Override
    public double area() {
        return a*a*6;
    }

    @Override
    public double volume() {
        return a*a*a;
    }
}
class Cylinder implements Container{
    double a,b;
//a是半径 b是高
    public Cylinder(double a, double b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public double area() {
        return Container.pi*(2*a*a+2*a*b);
    }

    @Override
    public double volume() {
        return Container.pi*a*a*b;
    }
}

  

  7-1:代码与6-1大部分相似,新加电话打电话功能,要注意,手机打手机时,不在南昌市的接听电话也要钱,所有也要把通话记录,接听记录也要放在被打电话人通话记录上,同时计算费用市也要计算接听费用。不知道为什么有一个多用户含非法输入错误,有俩分拿不到

  8-1:代码有上限,把之前的代码原有基础加代码复制粘贴的时候会显示代码超出限制,所以要之前的一些代码删除

  8-2:考察了内部类

  8-3:填补代码,多态使用

          接口不能被创建对象,接口中的抽象方法由实现类实现。实现类使用implements实现接口,可以同时实现多个接口。接口的函数不是静态就是抽象,变量都是静态。

    抽象类和接口都不能被直接实例化,他们都需要被继承或实现。 (类和抽象类中间是继承关系,类和接口是实现关系,接口和接口之间可以有继承关系)

     接口和抽象类都可以包含抽象方法,实现或继承他们的普通类必须重写抽象方法。 抽象类和接口,都可以体现在多态中,作为变量数据类型接收子类实例对象。

四、改进建议

  代码数量太多修改时非常不方便,平常写代码时可以养成边写代码边加注释,这样方便后期修改,变量起名字时尽量与用途联系起来,后面变量多的时候看着变量名可能会忘记。

 函数尽量使用模块化,这样调用起来方便,而且修改起来方便不会有太大的问题

 正则表达式,一个Pattern可以生成多个Matcher对象

五、总结

  通过这段时间的作业,对于接口、抽象类、以及多态有了更加深刻的了解,我觉得这段时间的作业效果比之前的图形号,并没有太多的考察数学,更多的是一些基础知识,即在巩固基础的同时又在提高我们的思维能力

  通过这段时间的学习,学习到了不少新的知识,老师对了泛型讲的更加深入,以及介绍了迭代器,集合sort()方法对应非基本类型排序时应该怎么处理

  下次pta等作业结束,希望把测试用例发出来

posted @ 2022-06-16 20:33  dragon-go  阅读(35)  评论(0)    收藏  举报