OO第三次博客作业

OO第三次博客作业

前言:

1、知识点总结:

① 字符串操作,正则表达式的训练及应用。

② 类与对象的设计,继承与多态,接口,内部类,抽象类

2、题量:不多

3、难度分析:

题目集8:难在7-1 电信计费系列1-座机计费:①理解题目的意思②理解类间关系③正则表达式

题目集9:难在7-1 电信计费系列2-手机+座机计费混合拨打

题目集10:相比前两个题目集较为简单


 


 

源码设计与分析:


 

一、212016/71-题目集08——7-1 电信计费系列1-座机计费

  1.题目(如下图)

 

 

 

  2.源码设计与分析

 

 本题肯定是要先理解清楚题目的意思,再去理解题目所给的类图,然后根据类图写好所需的类,之后在主类里写好方法

正则表达式:

String regex = "u-([0-9]){11,12} 0|t-[0-9]{11,12} [0-9]{10,12}( [0-9]{4}.([1-9]|10|11|12).([0-9]|[1-3][0-9]) ([0-9]|[0-2][0-9]):([0-5][0-9]):([0-5][0-9]))+|end";

 

 

  3.源码

  1 import java.text.DateFormatSymbols;
  2 import java.text.ParseException;
  3 import java.util.ArrayList;
  4 import java.util.Collections;
  5 import java.util.Comparator;
  6 import java.util.Date;
  7 import java.util.Scanner;
  8 import java.util.regex.Matcher;
  9 import java.util.regex.Pattern;
 10 import java.text.SimpleDateFormat;
 11 
 12 public class Main {
 13     static ArrayList<String> datas = new ArrayList<String>();
 14     static ArrayList<User> users = new ArrayList<User>();
 15     static ArrayList<CallRecord> callRecords = new ArrayList<CallRecord>();
 16     static ArrayList<String[]> tDatas = new ArrayList<String[]>();
 17     
 18     public static void main(String[] args)  throws ParseException{
 19         // TODO Auto-generated method stub
 20         Scanner in = new Scanner(System.in);
 21         String data;
 22         while(true) {
 23             data = in.nextLine();
 24             if(data.equals("end")) break;
 25             datas.add(data);
 26         }
 27         remove();
 28         saveData();
 29         usersSort();
 30         cal_output();
 31     }
 32     
 33     //用户按号码排序
 34     public static void usersSort() {
 35         Collections.sort(users);
 36         
 37     }
 38     
 39     public static void cal_output() {
 40         for(int i = 0;i<users.size();i++) {
 41             System.out.print(users.get(i).getNumber()+" "); 
 42             System.out.printf("%.1f %.1f\n",users.get(i).calCost(),users.get(i).calBalance());
 43         }
 44         
 45     }
 46     
 47     //判断是否什么地区打电话
 48     public static String callRecordsArea(CallRecord callRecord) {
 49         String cord = callRecord.getAnswerAddressAreaCord();
 50         if(cord.equals("0791")) {
 51             return "lnCity";
 52         }else if((cord.charAt(0)=='0'&&cord.charAt(1)=='7'&&cord.charAt(2)=='9'&&cord.charAt(3)>='0'&&cord.charAt(3)<='9')||(cord.equals("0701")) ) {
 53             return "lnProvince";
 54         }else {
 55             return "lnLand";
 56         }
 57     }
 58     
 59     public static void saveData() throws ParseException {
 60         SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
 61         String data =new String();
 62         for(int i = 0;i<datas.size();i++) {
 63             data = datas.get(i);
 64             if(data.charAt(0)=='u') {
 65                 Pattern pattern = Pattern.compile("[0-9]{10,12}");
 66                 Matcher matcher = pattern.matcher(data);
 67                 while (matcher.find()){
 68                     users.add(new User());
 69                     users.get(users.size()-1).setNumber(matcher.group(0));
 70                 }
 71             }else if(data.charAt(0)=='t') {
 72                 tDatas.add(new String[4]);
 73                 Pattern pattern1 = Pattern.compile("[0-9]{10,12}");
 74                 Matcher matcher1 = pattern1.matcher(data);
 75                 Pattern pattern2 = Pattern.compile("\\d{1,4}\\.\\d(\\d)?\\.\\d(\\d)?\\ \\d(\\d)?\\:\\d(\\d)?\\:\\d(\\d)?");
 76                 Matcher matcher2 = pattern2.matcher(data);
 77                 int num = 0;
 78                 while (matcher1.find()){
 79                     tDatas.get(tDatas.size()-1)[num] = matcher1.group(0);
 80                     num++;
 81                 }
 82                 while (matcher2.find()){
 83                     tDatas.get(tDatas.size()-1)[num] = matcher2.group(0);
 84                     num++;
 85                 }
 86             } 
 87         }
 88         
 89         for(int i = 0;i<tDatas.size();i++) {
 90             callRecords.add(new CallRecord());
 91             callRecords.get(i).setCallingNumber(tDatas.get(i)[0]);
 92             callRecords.get(i).setAnswerNumber(tDatas.get(i)[1]);
 93             callRecords.get(i).setStartTime(sd.parse(tDatas.get(i)[2]));
 94             callRecords.get(i).setEndTime(sd.parse(tDatas.get(i)[3]));
 95             callRecords.get(i).setCallingAddressAreaCord(tDatas.get(i)[0].substring(0, 4));
 96             callRecords.get(i).setAnswerAddressAreaCord(tDatas.get(i)[1].substring(0, 4));
 97             if(callRecords.get(i).getStartTime().getTime()-callRecords.get(i).getEndTime().getTime()>0) {
 98                 callRecords.remove(callRecords.size()-1);
 99                 tDatas.remove(i);i--;continue;
100             }
101         }
102         
103         for(int i = 0;i<users.size();i++) {
104             for(int j = 0;j<callRecords.size();j++) {
105                 if(users.get(i).getNumber().equals(callRecords.get(j).getCallingNumber())) {
106                     if( callRecords.get(j).getAnswerAddressAreaCord().equals("0791") ) {
107                         users.get(i).getUserRecord().addCallinglnCityRecords(callRecords.get(j));
108                     }else if( (callRecords.get(j).getAnswerAddressAreaCord().charAt(0)=='0'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(1)=='7'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(2)=='9'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(3)>='0'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(3)<='9')||(callRecords.get(j).getAnswerAddressAreaCord().equals("0701"))) {
109                         users.get(i).getUserRecord().addCallinglnProvinceRecords(callRecords.get(j));
110                     }else {
111                         users.get(i).getUserRecord().addCallinglnLandRecords(callRecords.get(j));
112                     }
113                 }
114             }
115         }
116 
117     }
118     //剔除不合法数据
119     public static void remove() {
120         for(int i = 0;i<datas.size();i++) {
121             
122             if(datas.get(i).length()==0) {
123                 datas.remove(i);
124                 i--;continue;
125             }
126             for(int j = 0;j<datas.size();j++) {
127                 if(datas.get(i).charAt(0)=='u'&&datas.get(i).equals(datas.get(j))&&i!=j) {
128                     datas.remove(j);
129                     j--;continue;
130                 }
131             }
132             if(!isFormatTure(datas.get(i))) {
133                 datas.remove(i);
134                 i--;continue;
135             }
136             if(datas.get(0).charAt(0)!='u') {
137                 datas.remove(0);
138                 i--;continue;
139             }
140         }
141     }
142     //判断输入格式是否合法
143     public static boolean isFormatTure(String data) {
144         String regex = "u-([0-9]){11,12} 0|t-[0-9]{11,12} [0-9]{10,12}( [0-9]{4}.([1-9]|10|11|12).([0-9]|[1-3][0-9]) ([0-9]|[0-2][0-9]):([0-5][0-9]):([0-5][0-9]))+|end";
145         boolean isFormatTure1 = data.matches(regex);
146         boolean isFormatTure2 = true;
147         if(data.charAt(0)=='t') {
148             Pattern pattern = Pattern.compile("\\d{1,4}\\.\\d(\\d)?\\.\\d(\\d)?\\ \\d(\\d)?\\:\\d(\\d)?\\:\\d(\\d)?");
149             Matcher matcher = pattern.matcher(data);
150             while (matcher.find()){
151                 isFormatTure2 = check(matcher.group(0));
152                 if(isFormatTure2==false) break;
153             }
154         }
155         return isFormatTure1&&isFormatTure2;
156     }
157     
158     public static boolean check (String str) {
159         SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//括号内为日期格式,y代表年份,M代表年份中的月份(为避免与小时中的分钟数m冲突,此处用M),d代表月份中的天数
160         try {
161             sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
162             sd.parse(str);//从给定字符串的开始解析文本,以生成一个日期
163         }
164         catch (Exception e) {
165             return false;
166         }
167         return true;
168     }
169     
170 }
171 //图一
172 class User implements Comparable<User>{
173     private UserRecords userRecord = new UserRecords();
174     private double balance = 100;
175     private ChargeMode chargeMode;
176     private String number;
177     
178     public double calBalance() {
179         return balance-calCost()-chargeMode.getMonthlyRent();
180     }
181     public double calCost() {
182         chargeMode = new LandinePhoneCharging();
183         
184         return chargeMode.calCost(userRecord);
185     }
186     
187     public UserRecords getUserRecord() {
188         return userRecord;
189     }
190     public void setUserRecord(UserRecords userRecord) {
191         this.userRecord = userRecord;
192     }
193     public double getBalance() {
194         return balance;
195     }
196     public ChargeMode getChargeMode() {
197         return chargeMode;
198     }
199     public void setChargeMode(ChargeMode chargeMode) {
200         this.chargeMode = chargeMode;
201     }
202     public String getNumber() {
203         return number;
204     }
205     public void setNumber(String number) {
206         this.number = number;
207     }
208     @Override
209     public int compareTo(User o) {
210         return this.number.compareTo(o.number);
211     }
212     
213 }
214 
215 class UserRecords{
216     private ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
217     private ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
218     private ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
219     private ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
220     private ArrayList<CallRecord> answerlnProvinceRecords = new ArrayList<CallRecord>();
221     private ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
222     private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
223     private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
224     
225     public void addCallinglnCityRecords(CallRecord callRecord) {
226         callinglnCityRecords.add(callRecord);
227     }
228     public void addCallinglnProvinceRecords(CallRecord callRecord) {
229         callinglnProvinceRecords.add(callRecord);
230     }
231     public void addCallinglnLandRecords(CallRecord callRecord) {
232         callinglnLandRecords.add(callRecord);
233     }
234     public void addAnswerlnCityRecords(CallRecord callRecord) {
235         answerlnCityRecords.add(callRecord);
236     }
237     public void addAnswerlnProvinceRecords(CallRecord callRecord) {
238         answerlnProvinceRecords.add(callRecord);
239     }
240     public void addAnswerlnLandRecords(CallRecord callRecord) {
241         answerlnLandRecords.add(callRecord);    
242     }
243     public void addSendMessageRecords(MessageRecord sendMessageRecord) {
244         sendMessageRecords.add(sendMessageRecord);
245     }
246     public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
247         receiveMessageRecords.add(receiveMessageRecord);
248     }
249 
250     public ArrayList<CallRecord> getCallinglnCityRecords() {
251         return callinglnCityRecords;
252     }
253     public ArrayList<CallRecord> getCallinglnProvinceRecords() {
254         return callinglnProvinceRecords;
255     }
256     public ArrayList<CallRecord> getCallinglnLandRecords() {
257         return callinglnLandRecords;
258     }
259     public ArrayList<CallRecord> getAnswerlnCityRecords() {
260         return answerlnCityRecords;
261     }
262     public ArrayList<CallRecord> getAnswerlnProvinceRecords() {
263         return answerlnProvinceRecords;
264     }
265     public ArrayList<CallRecord> getAnswerlnLandRecords() {
266         return answerlnLandRecords;
267     }
268     public ArrayList<MessageRecord> getSendMessageRecords() {
269         return sendMessageRecords;
270     }
271     public ArrayList<MessageRecord> getReceiveMessageRecords() {
272         return receiveMessageRecords;
273     }
274 
275 }
276 
277 abstract class ChargeMode{
278     private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
279 
280     public ArrayList<ChargeRule> getChargeRules() {
281         return chargeRules;
282     }
283 
284     public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
285         this.chargeRules = chargeRules;
286     }
287     
288     public void addChargeRules(ChargeRule chargeRule) {
289         chargeRules.add(chargeRule);
290     }
291     public abstract double calCost(UserRecords userRecord);
292     
293     public abstract double getMonthlyRent();
294 }
295 
296 class LandinePhoneCharging extends ChargeMode{
297     private double monthlyRent = 20;
298 
299     @Override
300     public double calCost(UserRecords userRecord) {
301         addChargeRules(new LandPhonelnCityRule());
302         addChargeRules(new LanPhonelnProvinceRule());
303         addChargeRules(new LandPhonelnLandRule());
304         return 
305         getChargeRules().get(0).calCost(userRecord.getCallinglnCityRecords())+
306         getChargeRules().get(1).calCost(userRecord.getCallinglnProvinceRecords())+
307         getChargeRules().get(2).calCost(userRecord.getCallinglnLandRecords());
308 
309         
310     }
311 
312     @Override
313     public double getMonthlyRent() {
314         return monthlyRent;
315     }
316     
317 }
318 
319 //图二
320 abstract class CommunicationRecord{
321     protected String callingNumber;
322     protected String answerNumber;
323     
324     public String getCallingNumber() {
325         return callingNumber;
326     }
327     public void setCallingNumber(String callingNumber) {
328         this.callingNumber = callingNumber;
329     }
330     public String getAnswerNumber() {
331         return answerNumber;
332     }
333     public void setAnswerNumber(String answerNumber) {
334         this.answerNumber = answerNumber;
335     }
336 }
337 
338 class CallRecord extends CommunicationRecord{
339     private Date startTime;
340     private Date endTime;
341     private String callingAddressAreaCord; 
342     private String answerAddressAreaCord;
343     
344     public Date getStartTime() {
345         return startTime;
346     }
347     public void setStartTime(Date startTime) {
348         this.startTime = startTime;
349     }
350     public Date getEndTime() {
351         return endTime;
352     }
353     public void setEndTime(Date endTime) {
354         this.endTime = endTime;
355     }
356     public String getCallingAddressAreaCord() {
357         return callingAddressAreaCord;
358     }
359     public void setCallingAddressAreaCord(String callingAddressAreaCord) {
360         this.callingAddressAreaCord = callingAddressAreaCord;
361     }
362     public String getAnswerAddressAreaCord() {
363         return answerAddressAreaCord;
364     }
365     public void setAnswerAddressAreaCord(String answerAddressAreaCord) {
366         this.answerAddressAreaCord = answerAddressAreaCord;
367     }
368 }
369 
370 class MessageRecord extends CommunicationRecord{
371     private String message;
372 
373     public String getMessage() {
374         return message;
375     }
376 
377     public void setMessage(String message) {
378         this.message = message;
379     }
380 }
381 
382 //图三
383 abstract class ChargeRule{
384     public abstract double calCost(ArrayList<CallRecord> callRecords) ;
385 }
386  
387 //abstract class CallChargeRule extends ChargeRule{
388 //    
389 //    
390 //}
391 
392 class LandPhonelnCityRule extends ChargeRule{
393 
394     @Override
395     public double calCost(ArrayList<CallRecord> callRecords) {
396         if(callRecords.size()==0) return 0;
397         double minute = 0;
398         double cost = 0;
399         for(int i = 0;i<callRecords.size();i++) {
400             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
401             cost += 0.1*(int)minute;
402             if(Math.abs(minute-(int)minute)>=10e-6) {
403                 cost += 0.1;
404             }
405         }
406         return cost;
407     }
408 }
409 
410 class LanPhonelnProvinceRule extends ChargeRule{
411     @Override
412     public double calCost(ArrayList<CallRecord> callRecords) {
413         if(callRecords.size()==0) return 0;
414         double minute = 0;
415         double cost = 0;
416         for(int i = 0;i<callRecords.size();i++) {
417             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
418             cost += 0.3*(int)minute;
419             if(Math.abs(minute-(int)minute)>=10e-6) {
420                 cost += 0.3;
421             }
422         }
423         return cost;
424     }
425     
426 }
427 
428 class LandPhonelnLandRule extends ChargeRule{
429     @Override
430     public double calCost(ArrayList<CallRecord> callRecords) {
431         if(callRecords.size()==0) return 0;
432         double minute = 0;
433         double cost = 0;
434         for(int i = 0;i<callRecords.size();i++) {
435             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
436                 cost += 0.6*(int)minute;
437                 if(Math.abs(minute-(int)minute)>=10e-6) {
438                     cost += 0.6;
439                 }
440         }
441         return cost;
442     }
443     
444 }

 

  4.类图

 

 

 

  5.踩坑心得

    ①

      具体操作:

 

      可以用一个接口

    

 

      复写的方法

    

 

      主类操作:

      

                    

    ②

      

      具体操作:

    

 

  5.改进建议:提取和储存用户通话记录的算法还有待改进

 


 

二、212016/71-题目集09——7-1 电信计费系列2-手机+座机计费

   1.题目(如下图)

 

  2.源码设计与分析:在上一个题目集的基础上添加手机用户,考虑接电话和市外,省外漫游的情况

  正则表达式:

    String regex = "u-([0-9]){10,12} (0|1)|u-1([0-9]){10} (1|3)|t-[0-9]{11,12}( [0-9]{3,4})? [0-9]{10,12}( [0-9]{3,4})?( [0-9]{4}.([1-9]|10|11|12).([0-9]|[1-3][0-9]) ([0-9]|[0-2][0-9]):([0-5][0-9]):([0-5][0-9])){2}|m-1[0-9]{10} 1[0-9]{10} ([0-9]|[a-zA-Z]|\\ |\\,|\\.)+|end";
 

  3.源码

 

   

  1 import java.text.DateFormatSymbols;
  2 import java.text.ParseException;
  3 import java.util.ArrayList;
  4 import java.util.Collections;
  5 import java.util.Comparator;
  6 import java.util.Date;
  7 import java.util.Scanner;
  8 import java.util.regex.Matcher;
  9 import java.util.regex.Pattern;
 10 import java.text.SimpleDateFormat;
 11 
 12 public class Main {
 13     static ArrayList<String> datas = new ArrayList<String>();
 14     static ArrayList<User> users = new ArrayList<User>();
 15     static ArrayList<CallRecord> callRecords = new ArrayList<CallRecord>();
 16     static ArrayList<String[]> tDatas = new ArrayList<String[]>();
 17     static ArrayList<MessageRecord> messageRecords = new ArrayList<MessageRecord>();
 18 
 19 
 20     
 21     public static void main(String[] args)  throws ParseException{
 22         // TODO Auto-generated method stub
 23         Scanner in = new Scanner(System.in);
 24         String data;
 25         while(true) {
 26             data = in.nextLine();
 27             if(data.equals("end")) break;
 28             datas.add(data);
 29         }
 30         remove();
 31         saveData();
 32         usersSort();
 33         cal_output();
 34     }
 35     
 36     //用户按号码排序
 37     public static void usersSort() {
 38         Collections.sort(users);
 39     }
 40     
 41     public static void cal_output() {
 42         for(int i = 0;i<users.size();i++) {
 43             System.out.print(users.get(i).getNumber()+" "); 
 44             System.out.printf("%.1f %.1f\n",users.get(i).calCost(),users.get(i).calBalance());
 45         }
 46     }
 47     
 48     //判断地址码是在市内,省内,还是省外
 49     public static int addressAreaCord(String addressAreaCord) {
 50         if(addressAreaCord.equals("0791")) {
 51             return 0;
 52         }else if((addressAreaCord.charAt(0)=='0'&&addressAreaCord.charAt(1)=='7'&&addressAreaCord.charAt(2)=='9'&&addressAreaCord.charAt(3)>='0'&&addressAreaCord.charAt(3)<='9')||(addressAreaCord.equals("0701")) ) {
 53             return 1;
 54         }else {
 55             return 2;
 56         }
 57     }
 58     
 59     //判断电话记录的类型
 60     public static String callRecordsArea(CallRecord callRecord) {
 61         String cord = callRecord.getAnswerAddressAreaCord();
 62         if(cord.equals("0791")) {
 63             return "lnCity";
 64         }else if((cord.charAt(0)=='0'&&cord.charAt(1)=='7'&&cord.charAt(2)=='9'&&cord.charAt(3)>='0'&&cord.charAt(3)<='9')||(cord.equals("0701")) ) {
 65             return "lnProvince";
 66         }else {
 67             return "lnLand";
 68         }
 69     }
 70     
 71     public static void saveData() throws ParseException {
 72         SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
 73         String data =new String();
 74         for(int i = 0;i<datas.size();i++) {
 75             data = datas.get(i);
 76             if(data.charAt(0)=='u') {
 77                 Pattern pattern = Pattern.compile("[0-9]{10,12}");
 78                 Matcher matcher = pattern.matcher(data);
 79                 while (matcher.find()){
 80                     users.add(new User());
 81                     users.get(users.size()-1).setNumber(matcher.group(0));
 82                     users.get(users.size()-1).setType(data.charAt(data.length()-1));
 83 
 84                 }
 85             }else if(data.charAt(0)=='t') {
 86                 tDatas.add(new String[4]);
 87                 Pattern pattern1 = Pattern.compile("[0-9]{10,12}( [0-9]{3,4} )?");
 88                 Matcher matcher1 = pattern1.matcher(data);
 89                 Pattern pattern2 = Pattern.compile("\\d{1,4}.\\d(\\d)?.\\d(\\d)? \\d(\\d)?:\\d(\\d)?:\\d(\\d)?");
 90                 Matcher matcher2 = pattern2.matcher(data);
 91                 int num = 0;
 92                 while (matcher1.find()){
 93                     tDatas.get(tDatas.size()-1)[num] = matcher1.group(0);
 94                     num++;
 95                 }
 96                 while (matcher2.find()){
 97                     tDatas.get(tDatas.size()-1)[num] = matcher2.group(0);
 98                     num++;
 99                 }
100             }else if(data.charAt(0)=='m') {
101                 messageRecords.add(new MessageRecord());
102                 Pattern pattern1 = Pattern.compile("1[0-9]{10}");
103                 Matcher matcher1 = pattern1.matcher(data);
104                 
105                 int num = 0;
106                 while (matcher1.find()){
107                     if(num == 0) {
108                         messageRecords.get(messageRecords.size()-1).setCallingNumber(matcher1.group(0));
109                     }else if(num == 1) {
110                         messageRecords.get(messageRecords.size()-1).setAnswerNumber(matcher1.group(0));                        
111                     }
112                     num++;
113                 }
114                 messageRecords.get(messageRecords.size()-1).setMessage(data.substring(27));
115                 
116             }
117         }
118         
119         for(int i = 0;i<tDatas.size();i++) {
120             callRecords.add(new CallRecord());
121             
122             callRecords.get(i).setStartTime(sd.parse(tDatas.get(i)[2]));
123             callRecords.get(i).setEndTime(sd.parse(tDatas.get(i)[3]));
124             if(tDatas.get(i)[0].length()<=12) {
125                 callRecords.get(i).setCallingNumber(tDatas.get(i)[0]);
126                 callRecords.get(i).setCallingAddressAreaCord(tDatas.get(i)[0].substring(0, 4));
127             }else {
128                 callRecords.get(i).setCallingNumber(tDatas.get(i)[0].substring(0, tDatas.get(i)[0].indexOf(' ')));
129                 callRecords.get(i).setCallingAddressAreaCord(tDatas.get(i)[0].substring(tDatas.get(i)[0].indexOf(' ')+1, tDatas.get(i)[0].lastIndexOf(' ')));
130             }
131             if(tDatas.get(i)[1].length()<=12) {
132                 callRecords.get(i).setAnswerNumber(tDatas.get(i)[1]);
133                 callRecords.get(i).setAnswerAddressAreaCord(tDatas.get(i)[1].substring(0, 4));
134             }else {
135                 callRecords.get(i).setAnswerNumber(tDatas.get(i)[1].substring(0, tDatas.get(i)[1].indexOf(' ')));
136                 callRecords.get(i).setAnswerAddressAreaCord(tDatas.get(i)[1].substring(tDatas.get(i)[1].indexOf(' ')+1, tDatas.get(i)[1].lastIndexOf(' ')));
137             }
138             if(callRecords.get(i).getStartTime().getTime()-callRecords.get(i).getEndTime().getTime()>0) {
139                 callRecords.remove(callRecords.size()-1);
140                 tDatas.remove(i);i--;continue;
141             }
142         }
143         
144         for(int i = 0;i<users.size();i++) {
145             for(int j = 0;j<callRecords.size();j++) {
146                 if(users.get(i).getNumber().equals(callRecords.get(j).getCallingNumber())&&users.get(i).getType()=='0') {
147                     if( callRecords.get(j).getAnswerAddressAreaCord().equals("0791") ) {
148                         users.get(i).getUserRecord().addCallinglnCityRecords(callRecords.get(j));
149                     }else if( (callRecords.get(j).getAnswerAddressAreaCord().charAt(0)=='0'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(1)=='7'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(2)=='9'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(3)>='0'&&callRecords.get(j).getAnswerAddressAreaCord().charAt(3)<='9')||(callRecords.get(j).getAnswerAddressAreaCord().equals("0701"))) {
150                         users.get(i).getUserRecord().addCallinglnProvinceRecords(callRecords.get(j));
151                     }else {
152                         users.get(i).getUserRecord().addCallinglnLandRecords(callRecords.get(j));
153                     }
154                 }
155                 if(users.get(i).getNumber().equals(callRecords.get(j).getCallingNumber())&&users.get(i).getType()=='1') {
156                     if(  addressAreaCord(callRecords.get(j).getCallingAddressAreaCord())==0&& addressAreaCord(callRecords.get(j).getAnswerAddressAreaCord())==0 ) {
157                         users.get(i).getUserRecord().addCallinglnCityRecords(callRecords.get(j));
158                     }else if(  addressAreaCord(callRecords.get(j).getCallingAddressAreaCord())==0&& addressAreaCord(callRecords.get(j).getAnswerAddressAreaCord())==1 ) {
159                         users.get(i).getUserRecord().addCallinglnCity_lnProvinceRecords(callRecords.get(j));    
160                     }else if(  addressAreaCord(callRecords.get(j).getCallingAddressAreaCord())==0&& addressAreaCord(callRecords.get(j).getAnswerAddressAreaCord())==2 ) {
161                         users.get(i).getUserRecord().addCallinglnProvinceRecords(callRecords.get(j));
162                     }else if(  addressAreaCord(callRecords.get(j).getCallingAddressAreaCord())==1) {
163                         users.get(i).getUserRecord().addCallinglnProvinceRecords(callRecords.get(j));
164                     }else if(  addressAreaCord(callRecords.get(j).getCallingAddressAreaCord())==2) {
165                         users.get(i).getUserRecord().addCallinglnLandRecords(callRecords.get(j));
166                     }
167                 }
168                 if(users.get(i).getNumber().equals(callRecords.get(j).getAnswerNumber())&&users.get(i).getType()=='1') {
169                     if( addressAreaCord(callRecords.get(j).getAnswerAddressAreaCord())==2) {
170                         users.get(i).getUserRecord().addAnswerlnLandRecords(callRecords.get(j));
171                     }
172                 }
173             }
174         }
175         for(int i = 0;i<users.size();i++) {
176             for(int j = 0;j<messageRecords.size();j++) {
177                 if(users.get(i).getNumber().equals(messageRecords.get(j).getCallingNumber())&&users.get(i).getType()=='3') {
178                     users.get(i).getUserRecord().addSendMessageRecords(messageRecords.get(j));
179                 }
180             }
181         }
182         
183     }
184     //剔除不合法数据
185     public static void remove() {
186         for(int i = 0;i<datas.size();i++) {
187             
188             if(datas.get(i).length()==0) {
189                 datas.remove(i);
190                 i--;continue;
191             }
192             for(int j = 0;j<datas.size();j++) {
193                 if(datas.get(i).charAt(0)=='u'&&datas.get(i).equals(datas.get(j))&&i!=j) {
194                     datas.remove(j);
195                     j--;continue;
196                 }
197             }
198             if(!isFormatTure(datas.get(i))) {
199                 datas.remove(i);
200                 i--;continue;
201             }
202             if(datas.get(0).charAt(0)!='u') {
203                 datas.remove(0);
204                 i--;continue;
205             }
206         }
207     }
208     //判断输入格式是否合法
209     public static boolean isFormatTure(String data) {
210         String regex = "u-([0-9]){10,12} (0|1)|u-1([0-9]){10} (1|3)|t-[0-9]{11,12}( [0-9]{3,4})? [0-9]{10,12}( [0-9]{3,4})?( [0-9]{4}.([1-9]|10|11|12).([0-9]|[1-3][0-9]) ([0-9]|[0-2][0-9]):([0-5][0-9]):([0-5][0-9])){2}|m-1[0-9]{10} 1[0-9]{10} ([0-9]|[a-zA-Z]|\\ |\\,|\\.)+|end";
211         boolean isFormatTure1 = data.matches(regex);
212         boolean isFormatTure2 = true;
213         if(data.charAt(0)=='t') {
214             Pattern pattern = Pattern.compile("\\d{1,4}.\\d(\\d)?.\\d(\\d)? \\d(\\d)?:\\d(\\d)?:\\d(\\d)?");
215             Matcher matcher = pattern.matcher(data);
216             while (matcher.find()){
217                 isFormatTure2 = check(matcher.group(0));
218                 if(isFormatTure2==false) break;
219             }
220         }
221         return isFormatTure1&&isFormatTure2;
222     }
223     
224     public static boolean check (String str) {
225         SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");//括号内为日期格式,y代表年份,M代表年份中的月份(为避免与小时中的分钟数m冲突,此处用M),d代表月份中的天数
226         try {
227             sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
228             sd.parse(str);//从给定字符串的开始解析文本,以生成一个日期
229         }
230         catch (Exception e) {
231             return false;
232         }
233         return true;
234     }
235     
236 }
237 //图一
238 class User implements Comparable<User>{
239     private UserRecords userRecord = new UserRecords();
240     private double balance = 100;
241     private ChargeMode chargeMode;
242     private String number;
243     private char type;
244     
245     public double calBalance() {
246         if(this.type=='3') {
247             return balance-calCost();
248         }else {
249             return balance-calCost()-chargeMode.getMonthlyRent();            
250         }
251     }
252     public double calCost() {
253         if(this.type=='0') {
254             chargeMode = new LandinePhoneCharging();
255         }else {
256             chargeMode = new cellPhoneCharging();
257         }
258         return chargeMode.calCost(userRecord);
259     }
260     public UserRecords getUserRecord() {
261         return userRecord;
262     }
263     public void setUserRecord(UserRecords userRecord) {
264         this.userRecord = userRecord;
265     }
266     public double getBalance() {
267         return balance;
268     }
269     public ChargeMode getChargeMode() {
270         return chargeMode;
271     }
272     public void setChargeMode(ChargeMode chargeMode) {
273         this.chargeMode = chargeMode;
274     }
275     public String getNumber() {
276         return number;
277     }
278     public void setNumber(String number) {
279         this.number = number;
280     }
281     public char getType() {
282         return type;
283     }
284     public void setType(char type) {
285         this.type = type;
286     }
287     @Override
288     public int compareTo(User o) {
289         return this.number.compareTo(o.number);
290     }
291     
292 }
293 
294 class UserRecords{
295     private ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
296     private ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
297     private ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
298     private ArrayList<CallRecord> callinglnCity_lnProvinceRecords = new ArrayList<CallRecord>();
299     private ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
300     private ArrayList<CallRecord> answerlnProvinceRecords = new ArrayList<CallRecord>();
301     private ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
302     private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<MessageRecord>();
303     private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<MessageRecord>();
304     
305     public void addCallinglnCityRecords(CallRecord callRecord) {
306         callinglnCityRecords.add(callRecord);
307     }
308     public void addCallinglnProvinceRecords(CallRecord callRecord) {
309         callinglnProvinceRecords.add(callRecord);
310     }
311     public void addCallinglnLandRecords(CallRecord callRecord) {
312         callinglnLandRecords.add(callRecord);
313     }
314     public void addCallinglnCity_lnProvinceRecords(CallRecord callRecord) {
315         callinglnCity_lnProvinceRecords.add(callRecord);
316     }
317     public void addAnswerlnCityRecords(CallRecord callRecord) {
318         answerlnCityRecords.add(callRecord);
319     }
320     public void addAnswerlnProvinceRecords(CallRecord callRecord) {
321         answerlnProvinceRecords.add(callRecord);
322     }
323     public void addAnswerlnLandRecords(CallRecord callRecord) {
324         answerlnLandRecords.add(callRecord);    
325     }
326     public void addSendMessageRecords(MessageRecord sendMessageRecord) {
327         sendMessageRecords.add(sendMessageRecord);
328     }
329     public void addReceiveMessageRecords(MessageRecord receiveMessageRecord) {
330         receiveMessageRecords.add(receiveMessageRecord);
331     }
332 
333     public ArrayList<CallRecord> getCallinglnCityRecords() {
334         return callinglnCityRecords;
335     }
336     public ArrayList<CallRecord> getCallinglnProvinceRecords() {
337         return callinglnProvinceRecords;
338     }
339     public ArrayList<CallRecord> getCallinglnLandRecords() {
340         return callinglnLandRecords;
341     }
342     public ArrayList<CallRecord> getAnswerlnCityRecords() {
343         return answerlnCityRecords;
344     }
345     public ArrayList<CallRecord> getAnswerlnProvinceRecords() {
346         return answerlnProvinceRecords;
347     }
348     public ArrayList<CallRecord> getAnswerlnLandRecords() {
349         return answerlnLandRecords;
350     }
351     
352     public ArrayList<CallRecord> getCallinglnCity_lnProvinceRecords() {
353         return callinglnCity_lnProvinceRecords;
354     }
355     public ArrayList<MessageRecord> getSendMessageRecords() {
356         return sendMessageRecords;
357     }
358     public ArrayList<MessageRecord> getReceiveMessageRecords() {
359         return receiveMessageRecords;
360     }
361 
362 }
363 
364 abstract class ChargeMode{
365     private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
366 
367     public ArrayList<ChargeRule> getChargeRules() {
368         return chargeRules;
369     }
370 
371     public void setChargeRules(ArrayList<ChargeRule> chargeRules) {
372         this.chargeRules = chargeRules;
373     }
374     
375     public void addChargeRules(ChargeRule chargeRule) {
376         chargeRules.add(chargeRule);
377     }
378     public abstract double calCost(UserRecords userRecord);
379     
380     public abstract double getMonthlyRent();
381 }
382 
383 class LandinePhoneCharging extends ChargeMode{
384     private double monthlyRent = 20;
385 
386     @Override
387     public double calCost(UserRecords userRecord) {
388         addChargeRules(new LandPhonelnCityRule());
389         addChargeRules(new LandPhonelnProvinceRule());
390         addChargeRules(new LandPhonelnLandRule());
391         return 
392         ((LandPhonelnCityRule) getChargeRules().get(0)).calCost(userRecord.getCallinglnCityRecords())+
393         ((LandPhonelnProvinceRule) getChargeRules().get(1)).calCost(userRecord.getCallinglnProvinceRecords())+
394         ((LandPhonelnLandRule) getChargeRules().get(2)).calCost(userRecord.getCallinglnLandRecords());
395     }
396 
397     @Override
398     public double getMonthlyRent() {
399         return monthlyRent;
400     }
401 }
402 
403 class cellPhoneCharging extends ChargeMode{
404     private double monthlyRent = 15;
405 
406     @Override
407     public double calCost(UserRecords userRecord) {
408         addChargeRules(new LandPhonelnCityRule());
409         addChargeRules(new LandPhonelnProvinceRule());
410         addChargeRules(new LandPhonelnLandRule());
411         addChargeRules(new LandPhonelnCity_lnProvinceRule());
412         addChargeRules(new SendMessageRule());
413         return 
414         ((LandPhonelnCityRule) getChargeRules().get(0)).calCost(userRecord.getCallinglnCityRecords())+
415         ((LandPhonelnProvinceRule) getChargeRules().get(1)).calCost(userRecord.getCallinglnProvinceRecords())+
416         ((LandPhonelnProvinceRule) getChargeRules().get(1)).calCost(userRecord.getAnswerlnLandRecords())+
417         ((LandPhonelnLandRule) getChargeRules().get(2)).calCost(userRecord.getCallinglnLandRecords())+
418         ((LandPhonelnCity_lnProvinceRule) getChargeRules().get(3)).calCost(userRecord.getCallinglnCity_lnProvinceRecords())+
419         ((SendMessageRule) getChargeRules().get(4)).calCost(userRecord.getSendMessageRecords());
420     }
421 
422     @Override
423     public double getMonthlyRent() {
424         return monthlyRent;
425     }
426     
427 }
428 
429 //图二
430 abstract class CommunicationRecord{
431     protected String callingNumber;
432     protected String answerNumber;
433     
434     public String getCallingNumber() {
435         return callingNumber;
436     }
437     public void setCallingNumber(String callingNumber) {
438         this.callingNumber = callingNumber;
439     }
440     public String getAnswerNumber() {
441         return answerNumber;
442     }
443     public void setAnswerNumber(String answerNumber) {
444         this.answerNumber = answerNumber;
445     }
446 }
447 
448 class CallRecord extends CommunicationRecord{
449     private Date startTime;
450     private Date endTime;
451     private String callingAddressAreaCord; 
452     private String answerAddressAreaCord;
453     
454     public Date getStartTime() {
455         return startTime;
456     }
457     public void setStartTime(Date startTime) {
458         this.startTime = startTime;
459     }
460     public Date getEndTime() {
461         return endTime;
462     }
463     public void setEndTime(Date endTime) {
464         this.endTime = endTime;
465     }
466     public String getCallingAddressAreaCord() {
467         return callingAddressAreaCord;
468     }
469     public void setCallingAddressAreaCord(String callingAddressAreaCord) {
470         this.callingAddressAreaCord = callingAddressAreaCord;
471     }
472     public String getAnswerAddressAreaCord() {
473         return answerAddressAreaCord;
474     }
475     public void setAnswerAddressAreaCord(String answerAddressAreaCord) {
476         this.answerAddressAreaCord = answerAddressAreaCord;
477     }
478 }
479 
480 class MessageRecord extends CommunicationRecord{
481     private String message;
482 
483     public String getMessage() {
484         return message;
485     }
486 
487     public void setMessage(String message) {
488         this.message = message;
489     }
490 }
491 
492 //图三
493 abstract class ChargeRule{
494     
495 }
496  
497 abstract class MessageChargeRule extends ChargeRule{
498     public abstract double calCost(ArrayList<MessageRecord> messageRecords) ;
499 }
500 
501 class SendMessageRule extends MessageChargeRule{
502     @Override
503     public double calCost(ArrayList<MessageRecord> messageRecords) {
504         if(messageRecords.size()==0) return 0;
505         
506         double cost = 0;
507         int messageNum = 0;
508         for(int i = 0;i<messageRecords.size();i++) {
509             int length = 0;
510             length = messageRecords.get(i).getMessage().length();
511             messageNum += length/10;
512             if(length%10!=0) {
513                 messageNum += 1;
514             }
515         }
516         if(messageNum<=3) {
517             cost += 0.1*messageNum;
518         }else if(messageNum>3&&messageNum<=5) {
519             cost += 0.1*3+0.2*(messageNum-3);
520         }else {
521             cost += 0.1*3+0.2*2+0.3*(messageNum-5);
522         }
523         return cost;
524     }
525 }
526 
527 abstract class CallChargeRule extends ChargeRule{
528     public abstract double calCost(ArrayList<CallRecord> callRecords) ;
529 }
530 
531 class LandPhonelnCityRule extends CallChargeRule{
532 
533     @Override
534     public double calCost(ArrayList<CallRecord> callRecords) {
535         if(callRecords.size()==0) return 0;
536         double minute = 0;
537         double cost = 0;
538         for(int i = 0;i<callRecords.size();i++) {
539             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
540             cost += 0.1*(int)minute;
541             if(Math.abs(minute-(int)minute)>=10e-6) {
542                 cost += 0.1;
543             }
544         }
545         return cost;
546     }
547 }
548 
549 class LandPhonelnProvinceRule extends CallChargeRule{
550     @Override
551     public double calCost(ArrayList<CallRecord> callRecords) {
552         if(callRecords.size()==0) return 0;
553         double minute = 0;
554         double cost = 0;
555         for(int i = 0;i<callRecords.size();i++) {
556             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
557             cost += 0.3*(int)minute;
558             if(Math.abs(minute-(int)minute)>=10e-6) {
559                 cost += 0.3;
560             }
561         }
562         return cost;
563     }
564     
565 }
566 
567 class LandPhonelnLandRule extends CallChargeRule{
568     @Override
569     public double calCost(ArrayList<CallRecord> callRecords) {
570         if(callRecords.size()==0) return 0;
571         double minute = 0;
572         double cost = 0;
573         for(int i = 0;i<callRecords.size();i++) {
574             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
575                 cost += 0.6*(int)minute;
576                 if(Math.abs(minute-(int)minute)>=10e-6) {
577                     cost += 0.6;
578                 }
579         }
580         return cost;
581     }
582     
583 }
584 
585 class LandPhonelnCity_lnProvinceRule extends CallChargeRule{
586     @Override
587     public double calCost(ArrayList<CallRecord> callRecords) {
588         if(callRecords.size()==0) return 0;
589         double minute = 0;
590         double cost = 0;
591         for(int i = 0;i<callRecords.size();i++) {
592             minute = (callRecords.get(i).getEndTime().getTime()-callRecords.get(i).getStartTime().getTime())/60000.0;
593                 cost += 0.2*(int)minute;
594                 if(Math.abs(minute-(int)minute)>=10e-6) {
595                     cost += 0.2;
596                 }
597         }
598         return cost;
599     }
600     
601 }

  4.类图

  

 

  5.踩坑心得

 

     

 

  6.改进建议:无

 



 

 

总结:

 

学会了什么:

 

1.通过对本阶段综合性总结,我对Java的基础语法(选择、函数、字符字符串相关操作、循环、方法、数组)有了更深层次的理解

 

2.对类与对象的设计原则有了更深层次的理解,了解了继承原则和多态特性,抽象类和接口,并能在实际编程加以应用

 

3.了解了什么是接口、抽象类,并能熟练应用

 

还需要改进加强的地方:

 

1.考虑问题不够全面

 

2.主函数不能做到完全解耦

 

3.算法不够精确不够简单

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2022-06-16 23:48  ArchieZhong  阅读(31)  评论(0)    收藏  举报
Document