Blog3-第三次分析作业

前言

  本次博客将对近三次大作业进行总结与分析,近三次大作业主要写了电信计费系统,每次大作业都会新增一个功能,第一次大作业是座机的计费,第二次加上了手机计费,第三次作业增加了短信计费的功能。主要考察了类的设计,正则表达式,以及Data 类的使用。三次作业题量及难度均适中。下面将对这三次作业进行具体分析。

设计与分析

  题目:电信计费系列1-座机计费

 实现一个简单的电信计费程序:
假设南昌市电信分公司针对市内座机用户采用的计费方式:
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
南昌市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
第一次代码稍微有点长,稍后会详细解释,下面还将附上本次代码的类图及复杂度分析图
类图

 

 

class Paixu implements Comparator<User>{
      //按照姓名进行排序
      @Override
      public int compare(User p1, User p2) {
        // TODO Auto-generated method stub
        return p1.getnumber().compareTo(p2.getnumber());
      }
}
public class Main {

    public static void main(String[] args) throws ParseException {
        // TODO Auto-generated method stub
        Data data = new Data();
        data.dealString();
        data.paixu();
        data.quchong(data.users);
        for(int i = 0;i<data.users.size();i++)
        {
            for(int j = 0;j<data.records.size();j++)
            {
                if(data.users.get(i).getnumber().equals(data.records.get(j).getCallingNumber()))
                {
                    User a = data.users.get(i);
                    CallRecord b =data.records.get(j);
                    a.r(b);
                }
            }
        }
        for(int i = 0;i<data.users.size();i++)
        {
            User a = data.users.get(i);
            double b = a.calcost();
            double c = a.getBalance();
            System.out.print(data.users.get(i).getnumber()+" ");
            System.out.printf("%.1f ",b);
            System.out.printf("%.1f",c);
            System.out.println();
        }

    }
}
class User {
    UserRecords userRecords = new UserRecords();
    LandPhoneInCityRule cr = new LandPhoneInCityRule();
    LandPhoneInlandRule lr = new LandPhoneInlandRule();
    LandPhoneInProvinceRule pr = new LandPhoneInProvinceRule();
    
    private double cost = 0;
    private double balance = 100;
    private char chargeMode;
    private String number;
    public User(char chargeMode, String number) {
        super();
        this.chargeMode = chargeMode;
        this.number = number;
    }

    public void r(CallRecord record)
    {
        userRecords.addin(record);
    }//计算话费
    public double calcost()
    {
        cost = cost +cr.calCost(userRecords.getCallingInCityRecords())+lr.calCost(userRecords.getCallingInLandRecords())+pr.calCost(userRecords.getCallingInProvinceRecords());
        return cost;
    }
    }//返回余额信息
    public double getBalance()
    {
        balance = balance - cost-20;
        return balance;
    }
    //返回计费模式
    public char getchargeMode()
    {
        return this.chargeMode;
    }//fanhui 号码
    public String getnumber()
    {
        return this.number;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (chargeMode != other.chargeMode)
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }
}
class UserRecords {
    //市内
    private ArrayList<CallRecord> calinCityRecords = new ArrayList<CallRecord>();
    //省内
    private ArrayList<CallRecord> calinProvinceRecords = new ArrayList<CallRecord>();
    //国内
    private ArrayList<CallRecord> calinLandRecords = new ArrayList<CallRecord>();
    
    public void addin(CallRecord record)
    {
        if(!this.addCallingInCityRecords(record))
        {
            if(!this.addCallingInProvinceRecords(record))
            {
                this.addCallingInLandRecords(record);
            }
        }
            
    }
    public boolean addCallingInCityRecords (CallRecord callRecord)
    {
        if(callRecord.getanswerAddressAreaCode().equals("0791"))
        {
            this.calinCityRecords.add(callRecord);
            return true;
        }else {
            return false;
        }
    }
    public boolean addCallingInProvinceRecords (CallRecord callRecord)
    {
        int n = Integer.parseInt(callRecord.getanswerAddressAreaCode());
        if(n >= 790&&n <= 799&&n != 791||n == 701)
        {
            this.calinProvinceRecords.add(callRecord);
            return true;
        }else {
            return false;
        }
    }
    public boolean addCallingInLandRecords (CallRecord callRecord)
    {
        int n = Integer.parseInt(callRecord.getanswerAddressAreaCode());
        if(n<790||n>799&&n!=701)
        {
            this.calinLandRecords.add(callRecord);
            return true;
        }else {
            return false;
        }
    }
    public void addAnswerInCityRecords (CallRecord answerRecord){
    }
    public void addAnswerInProvinceRecords (CallRecord answerRecord){
    }
    public void addAnswerInLandRecords (CallRecord answerRecord) {
    }
    public ArrayList<CallRecord> getCallingInCityRecords ()
    {
        return this.calinCityRecords;
    }
    public ArrayList<CallRecord> getCallingInProvinceRecords ()
    {
        return this.calinProvinceRecords;
    }
    public ArrayList<CallRecord> getCallingInLandRecords ()
    {
        return this.calinLandRecords;
    }
}
class Data {
    Scanner in = new Scanner(System.in);
    ArrayList<User> users = new ArrayList<User>();  
    ArrayList<CallRecord> records = new ArrayList<CallRecord>();
    ArrayList<String> data = new ArrayList<String>();
    public void dealString() throws ParseException
    {
        String g = in.nextLine();
        while(!g.equals("end"))
        {
            if(this.Wrongforamt(g))
            {
                if(g.charAt(0)=='u')
                {
                    if(this.Wrong(g.substring(2, (g.length()-2))))
                    {
                        if(this.Wrong1(g.charAt(g.length()-1)))
                        {
                            users.add(new User(g.charAt(g.length()-1),g.substring(2, (g.length()-2))));
                            g = in.nextLine();
                        }else {
                            g = in.nextLine();
                        }
                    }else {
                        g = in.nextLine();
                    }
                }else {
                    if(g.charAt(0)=='t')
                    {
                        if(this.SWrong(g))
                        {
                        String[] p = g.substring(2).split(" ");
                        if(this.Wrong(p[0])&&this.Wrong(p[1]))
                        {
                            if(this.Wrong2(p[2])&&this.Wrong2(p[4]))
                            {
                                if(this.Wrong3(p[3])&&this.Wrong3(p[5]))
                                {
                                    String time = p[2]+" "+p[3];
                                    String time1 = p[4]+" "+p[5];
                                    SimpleDateFormat spf2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
                                    Date Parse = spf2.parse(time);
                                    Date Parse1 = spf2.parse(time1);
                                                if(p[1].length()==11&&p[1].charAt(0)==8||p[1].length()==11&&p[1].charAt(1)==1||p[1].length()==11&&p[1].substring(0, 3).equals("021")||p[1].length()==11&&p[1].substring(0, 3).equals("022")||p[1].length()==11&&p[1].substring(0, 3).equals("023"))
                                                {
                                                    records.add(new CallRecord(Parse, Parse1,p[0].substring(0, 4),p[1].substring(0, 3), p[0], p[1]));
                                                }else {
                                                    records.add(new CallRecord(Parse, Parse1,p[0].substring(0, 4),p[1].substring(0, 4), p[0], p[1]));
                                                }
                                    g = in.nextLine();
                                }else {
                                    g = in.nextLine();
                                }
                            }else {
                                g = in.nextLine();
                            }
                        }else {
                            g = in.nextLine();
                        }
                        }else {
                            g = in.nextLine();
                        }
                    }
                }
            }else {
                g = in.nextLine();
            }
        }
    }
    public void paixu()
    {
        Paixu pi = new Paixu();
        Collections.sort(users,pi);
    }
    public void quchong(ArrayList list)
    {
         ArrayList newList = new ArrayList();    //1.创建新集合
            Iterator it = list.iterator();          //2.根据传入的集合(老集合)获取迭代器
            while(it.hasNext()){                    //3.遍历老集合
                Object obj = it.next();             //记录住每一个元素
                if(!(newList.contains(obj))){       //如果新集合中不包含老集合中的元素
                    newList.add(obj);               //将该元素进行添加
                }
            }
        this.users = newList;
     }
    public boolean SWrong(String s)
    {
        if(s .matches("[t]-0791[0-9]{7,8}\\s" + "0[0-9]{9,11}\\s" +
                "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.(((0?[13578]|1[02])\\.(0?" +
                "[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|(((" +
                "[0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))" +
                "\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])\\s" +
                "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})\\.((([13578]|1[02])\\.(" +
                "[1-9]|[12][0-9]|3[01]))|(([469]|11)\\.([1-9]|[12][0-9]|30))|(2\\.([1-9]|[1][0-9]|2[0-8]))))|(((" +
                "[0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))\\.2\\.29))" +
                "\\s([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])"))
        {
            return true;
        }else {
            return false;
        }
    }
    //判断选项
    public boolean Wrongforamt(String s)
    {
        if(s.matches("[ut]{1}-.+"))
        {
            return true;
        }else {
            return false;
        }
    }
    //判断号码
    public boolean Wrong(String s)
    {
        if(s.matches("^\\d{12}$")||s.matches("^\\d{11}$")||s.matches("^\\d{10}$"))
        {
            return true;
        }else {
            return false;
        }
    }
    //判断u最后一位
    public boolean Wrong1(char s)
    {
        if(s>='0'&&s<='2')
        {
            return true;
        }else {
            return false;
        }
    }
    //判断日期
    public boolean Wrong2(String s)
    {
        String[] a =s.split(".");
        if(s.matches("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}"))
        {
            return true;
        }else {
            return false;
        }
    }
    //判断时间
    public boolean Wrong3(String s)
    {
        if(s.matches("^\\d{2}\\:\\d{2}\\:\\d{2}"))
        {
            return true;
        }else {
            return false; 
        }
    }
}
abstract class CallChargeRule {
    //计算各收费规则的费用
    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(Date startTime, Date endTime, String callingAddressAreaCode, String answerAddressAreaCode,String callingNumber,String answerNumber) {
        super(callingNumber, answerNumber);
        this.startTime = startTime;
        this.endTime = endTime;
        this.callingAddressAreaCode = callingAddressAreaCode;
        this.answerAddressAreaCode = answerAddressAreaCode;
    }
    //得到时间差
    public int time()
    {
        if(Math.abs((int)((startTime.getTime()-endTime.getTime())%(1000*60)))==0)
        {
            return Math.abs((int)((startTime.getTime()-endTime.getTime())/1000/60));
        }else {
            return Math.abs((int)((startTime.getTime()-endTime.getTime())/1000/60))+1;
        }
    }
    public String getanswerAddressAreaCode()
    {
        return this.answerAddressAreaCode;
    }
    public String getcallingAddressAreaCode()
    {
        return this.callingAddressAreaCode;
    }
}
abstract class ChargeRule {
}
abstract class CommunicationRecord {
    private String callingNumber;
    private String answerNumber;
    
    public CommunicationRecord(String callingNumber, String answerNumber) {
        super();
        this.callingNumber = callingNumber;
        this.answerNumber = answerNumber;
    }
    public String getCallingNumber ()
    {
        return this.callingNumber;
    }
    public void setCallingNumber (String callingNumber)
    {
        this.callingNumber = callingNumber;
    }
    public String getAnswerNumber ()
    {
        return this.answerNumber;
    }
    public void setAnswerNumber (String answerNumber)
    {
        this.answerNumber = answerNumber;
    }
}

具体分析:

关于类:

  此次作业老师附上的类图,但我没有完全按照老师的类图来写,此次作业中UserRecord和Data,Paixu(我代码中对数据进行处理的类)和其他的一些小类我是按照自己的设计践行书写的,接下来我将具体分析类与类之间的联系。首先有User类(用户类),里面包含了建户的基本信息,号码,计费类型等属性。接着需要一个类可以接收信息,处理信息,于是我写了Data类,负责读取信息,并将所读取到的信息进行分别存储到两个容器中(User用户容器和CallRecord数据容器)。其次我需要将分类好的信息对应到每个用户之中。于是我写了UserRecord类,通过比对通讯信息中的号码和用户的开户号码,将通讯信息对应到每个用户下面,之后通过计费规则类将用户的使用费用计算出来。最后在Main函数中先调用数据处理的方法,在将数据分类最后输出接果。

这里用到了一些新的知识:

(1)使用了 SimpleDateFormat类,用来求时间差。首先确定自己程序中时间的格式,new 出一个新的对象 SimpleDateFormat spf2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

之后将时间同意转换为毫秒形式:Date Parse = spf2.parse(time);  再作差求出时间差

(2)一个用于排序的方法:将ArrayList里的元素按照自己需要的属性进行排序

 

import java.util.Comparator;

public class Paixu implements Comparator<User>{
      //按照姓名进行排序
      @Override
      public int compare(User p1, User p2) {
        // TODO Auto-generated method stub
        return p1.getnumber().compareTo(p2.getnumber());
      }
}

 

(3)一个去重的方法:将ArrayList里的重复元素去掉需要两个步骤

<1>写去重方法

//去除重复元素
    public void quchong(ArrayList list)
    {
         ArrayList newList = new ArrayList();    //1.创建新集合
            Iterator it = list.iterator();          //2.根据传入的集合(老集合)获取迭代器
            while(it.hasNext()){                    //3.遍历老集合
                Object obj = it.next();             //记录住每一个元素
                if(!(newList.contains(obj))){       //如果新集合中不包含老集合中的元素
                    newList.add(obj);               //将该元素进行添加
                }
            }
        this.users = newList;
     }

<2>重写用户的equle方法

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (chargeMode != other.chargeMode)
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }

第二题:电信计费系列2-手机+座机计费

题目:2、针对手机用户采用实时计费方式:
月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
u-13307912264 1
t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11

输入:
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题在电信计费系列1基础上增加类型1-手机实时计费。
手机设置0或者座机设置成1,此种错误可不做判断。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
座机打手机
t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
手机互打
t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11

注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。

输出:
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。

源码:所增源码(由于本次代码是在上次代码的基础上修改而成所以类图无太大改变,在此不在重复粘贴)

import java.util.ArrayList;
//手机市内打市内
public class phonecalinCityRecordsRule extends CallChargeRule {

    @Override
    public double calCost(ArrayList<CallRecord> callRecords) {
        double cost = 0;
        for(int i = 0;i<callRecords.size();i++)
        {
            CallRecord a = callRecords.get(i);
            cost = cost + a.time()*0.1;
        }
        return cost;
    }

}
public class phonecalinfrLandRecordsRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        double cost = 0;
        for(int i = 0;i<callRecords.size();i++)
        {
            CallRecord a = callRecords.get(i);
            cost = cost + a.time()*0.6;
        }
        return cost;
    }
}
public class phonecalinfrProvinceRecordsRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        double cost = 0;
        for(int i = 0;i<callRecords.size();i++)
        {
            CallRecord a = callRecords.get(i);
            cost = cost + a.time()*0.3;
        }
        return cost;
    }
}
public class phonecalinLandRecordsRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords) {
        double cost = 0;
        for(int i = 0;i<callRecords.size();i++)
        {
            CallRecord a = callRecords.get(i);
            cost = cost + a.time()*0.3;
        }
        return cost;
    }

第二次作业较之于第一次作业主要是增加了几个不同的计费类,以及对格式的判断做了些许的改变,没有太大的其他有价值的东西

只能说,把基础类打好了之后后续增删功能都十分方便

第三次作业:电信计费系列3-短信计费

题目:

实现一个简单的电信计费程序,针对手机的短信采用如下计费方式
1、接收短信免费,发送短信0.1元/条,超过3条0.2元/条,超过5条0.3元/条。
2、如果一次发送短信的字符数量超过10个,按每10个字符一条短信进行计算。

输入:
输入信息包括两种类型
1、逐行输入南昌市手机用户开户的信息,每行一个用户。
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐 3-手机短信计费)
例如:u-13305862264 3
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题只针对类型3-手机短信计费。
2、逐行输入本月某些用户的短信信息,短信的格式:
m-主叫号码,接收号码,短信内容 (短信内容只能由数字、字母、空格、英文逗号、英文句号组成)
m-18907910010 13305862264 welcome to jiangxi.
m-13305862264 18907910010 thank you.

注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出:
根据输入的详细短信信息,计算所有已开户的用户的当月短信费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理:
输入数据中出现的不符合格式要求的行一律忽略。
本题只做格式的错误判断,无需做内容上不合理的判断,比如同一个电话两条通讯记录的时间有重合、开户号码非南昌市的号码、自己给自己打电话等,此类情况都当成正确的输入计算。但时间的输入必须符合要求,比如不能输入2022.13.61 28:72:65。

本题只考虑短信计费,不考虑通信费用以及月租费。

 

 

 

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Data data = new Data();
        //对输入的信息进行处理
        data.dealString();
        data.paixu();
        data.quchong(data.users);
    
    for(int i = 0;i<data.users.size();i++)
    {
        for(int j = 0;j<data.mrecords.size();j++)
        {
            if(data.users.get(i).getnumber().equals(data.mrecords.get(j).getCallingNumber())&&data.users.get(i).getchargeMode()=='3')
            {
                User a2 = data.users.get(i);
                SendMessageRecord b2 = data.mrecords.get(j);
                a2.r3(b2);
            }
        }
    }
    //输出所有的用户信息
            double c = 0;
            for(int i = 0;i<data.users.size();i++)
            {
                User a = data.users.get(i);
                double b = a.calcost();
                if(a.getchargeMode()== '0')
                {
                    c = a.getBalance();
                }else {
                    if(a.getchargeMode()=='1')
                    {
                        c = a.getBanlance1();
                    }else {
                        c = a.getBanlance2();
                    }
                }
                System.out.print(data.users.get(i).getnumber()+" ");
                System.out.printf("%.1f ",b);
                System.out.printf("%.1f",c);
                System.out.println();
            }
}
}
abstract class CommunicationRecord {
    private String callingNumber;
    private String answerNumber;
    
    public CommunicationRecord(String callingNumber, String answerNumber) {
        super();
        this.callingNumber = callingNumber;
        this.answerNumber = answerNumber;
    }
    public String getCallingNumber ()
    {
        return this.callingNumber;
    }
    public void setCallingNumber (String callingNumber)
    {
        this.callingNumber = callingNumber;
    }
    public String getAnswerNumber ()
    {
        return this.answerNumber;
    }
    public void setAnswerNumber (String answerNumber)
    {
        this.answerNumber = answerNumber;
    }
}
class Paixu implements Comparator<User>{
      //按照姓名进行排序
      @Override
      public int compare(User p1, User p2) {
        // TODO Auto-generated method stub
        return p1.getnumber().compareTo(p2.getnumber());
      }
}
class Data {
    ArrayList<SendMessageRecord> mrecords = new ArrayList<SendMessageRecord>();
    ArrayList<User> users = new ArrayList<User>();  
    Scanner in = new Scanner(System.in);
    public void dealString()
    {
        String g = in.nextLine();
        while(!g.equals("end"))
        {
            if(this.Wrong4(g))
            {
                users.add(new User(g.charAt(g.length()-1),g.substring(2, (g.length()-2))));
                g = in.nextLine();
            }else {
                if(this.Wrong5(g))
                {
                    String a = g.substring(0, 25);
                    String b = g.substring(26);
                    String[] c = a.substring(2).split(" ");
                    mrecords.add(new SendMessageRecord(c[0], c[1], b));
                    g = in.nextLine();
                }else {
                    g = in.nextLine();
                }
            }
        }
    }
    
    //对元素进行排序
    public void paixu()
    {
        Paixu pi = new Paixu();
        Collections.sort(users,pi);
    }
    //去除重复元素
    public void quchong(ArrayList list)
    {
         ArrayList newList = new ArrayList();    //1.创建新集合
            Iterator it = list.iterator();          //2.根据传入的集合(老集合)获取迭代器
            while(it.hasNext()){                    //3.遍历老集合
                Object obj = it.next();             //记录住每一个元素
                if(!(newList.contains(obj))){       //如果新集合中不包含老集合中的元素
                    newList.add(obj);               //将该元素进行添加
                }
            }
        this.users = newList;
     }
    //判断用户信息计费
        public boolean Wrong5(String s)
        {
            if(s.matches("[m]-1[0-9]{10} 1[0-9]{10} [\\d a-zA-Z,.]{0,}"))
            {
                return true;
            }else {
                return false;
            }
        }
        //判断用户信息
        public boolean Wrong4(String s)
        {
            if(s.matches("[u]-1[0-9]{10} [1]")||s.matches("[u]-0[0-9]{9,11} [0]")||s.matches("[u]-1[0-9]{10} [3]"))
            {
                return true;
            }else {
                return false;
            }
        }
}
class SendMessageRecord extends CommunicationRecord{
    private String Message;
    public SendMessageRecord(String callingNumber, String answerNumber, String Message) {
        super(callingNumber, answerNumber);
        // TODO Auto-generated constructor stub
        this.Message = Message;
    }
    public String getMesssgae()
    {
        return this.Message;
    }
}
class SendMessageRule{
    
    public double calCost(ArrayList<SendMessageRecord> callRecords) {
        double cost = 0;
        int n = callRecords.size();
        for(int i = 0;i<callRecords.size();i++)
        {
            SendMessageRecord a = callRecords.get(i);
            int b = a.getMesssgae().length();
            if(b%10==0)
            {
                n = n + b/10 - 1;
            }else {
                n = n + b/10;
            }
        }
        if(n<=3)
        {
            cost = n*0.1;
        }else {
            if(n > 3&&n<=5)
            {
                cost = 0.3 + (n-3)*0.2;   
            }else {
                cost = 0.3 + 0.4 + (n-5)*0.3;
            }
        }
        return cost;
    }
}
class User {
    UserRecords userRecords = new UserRecords();
    SendMessageRule ms = new SendMessageRule();
    
    private double cost = 0;
    private double balance = 100;
    private char chargeMode;
    private String number;
    public User(char chargeMode, String number) {
        super();
        this.chargeMode = chargeMode;
        this.number = number;
    }

    public void r3(SendMessageRecord record)
    {
        userRecords.addin3(record);
    }
    //计算余额
    public double callbalace()
    {
        return 0;
    }
    //计算话费
    public double calcost()
    {
        cost = ms.calCost(userRecords.getSendMessageRecords());
        return cost;
    }


    //返回用户信息
    public UserRecords getuserRecordes()
    {
        return null;
    }
    public void setUserRecords(UserRecords userRecords)
    {
        
    }
    //返回余额信息
    public double getBalance()
    {
        double balance2 = balance - cost-20;
        return balance2;
    }
    public double getBanlance1()
    {
        double banlance1 = balance - cost -15;
        return banlance1;
    }
    public double getBanlance2()
    {
        double banlance3 = balance - cost;
        return banlance3;
    }
    //返回计费模式
    public char getchargeMode()
    {
        return this.chargeMode;
    }
    //fanhui 号码
    public String getnumber()
    {
        return this.number;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (chargeMode != other.chargeMode)
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }
}
class UserRecords {
    //短信
    private ArrayList<SendMessageRecord> MessageRecords = new ArrayList<SendMessageRecord>();
    
    public void addin3(SendMessageRecord record)
    {
        this.MessageRecords.add(record);
    }
    
    public ArrayList<SendMessageRecord> getSendMessageRecords()
    {
        return this.MessageRecords;
    }
}

第三次作业,也是在之前的基础少,增加了电信功能,只需要将电信记录读入,再将读入的记录对应到用户名下,再加上一个电信计费的算法,就可以求解了。

踩坑心得:
       (1)对数据进行处理时,代码的复杂度过高每次新增功能时都要花很大一部分精力在修改读取和判断格式错误上,下次可以多分出几个函数,提高代码复用率。

       (2)某些类的分工不够明确,比如uaer类里,还承担了计算总费用的功能,可以将这一项单分出来一个类。

       (3)在对ArrayList里的元素去重时,忽略了要重写User里的equles方法,导致去重无效。

改进建议:

(1)      进一步学习掌握类之间的关系,并建立正确的关系,可以减少代码的复杂度

(2)      尝试使用父类,抽象类,对代码进行忧化。

(3)      提高代码的复用性,可以多次引用代码,减少编码时间,提高效率。

总结:

       通过这几次大作业的磨练,对如何建立类,应该建立从具体对象中抽象出来的的类有了更近一步的认识以及认识了类与类之间的联系的重要性,和在代码中使用父类和抽象类的便捷和对代码性能提高的好处,

主要问题是对数据的输入,输出处理不熟练,以及输出的格式控制也需多加学习,即使是同一道题目,需要同一功能,但是由于改变了使用此功能时所使用的点,就导致此功能不适用,所以书写代码时不要过于具体化。可提高书写效率。

以上便是进几次大作业的全部总结。

 

 

 

 

 

 

posted @ 2022-06-10 00:02  闲?  阅读(43)  评论(0)    收藏  举报