最后三次大作业的总结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.总结
类图对代码的实现尤为重要。我们可以在编写代码前先实现类图,然后根据类图实现代码。同时我们在编写代码时需要考虑到未来的规划,比如添加新功能,实现新方法。因此我们的代码需要有足够的扩展性。
                
            
        
浙公网安备 33010602011771号