10-16周作业总结

一.     前言

截至目前,这个学期的Java课程不知不觉的接近了尾声。在第10-16周的作业中主要的大作业是短信计费为主的,其中穿插着温习面向对象语言一些特性的习题。大作业相对于前几次的大作业,侧重点有所改变,从倾向数学算法向着重设计类之间的关联性进行了一个过度。总体来说是相对简单了些许,但是还会有些难度,难关从数学算法转换到了对于类之间的关联问题。例如:如何合理的利用抽象类,接口等一些相关的概念来使你的代码的逻辑性和可拓展性更高。

二.   设计与分析

题目集6   7-1  

 

  1 package test2;
  2 
  3 
  4 
  5 import java.text.ParseException;
  6 import java.util.Date;
  7 import java.util.Iterator;
  8 import java.util.ArrayList;
  9 import java.util.Scanner;
 10 import java.util.regex.Pattern;
 11 import java.util.regex.Matcher;
 12 import java.text.SimpleDateFormat;
 13 import java.util.Collections;
 14 
 15 
 16 class User
 17 {
 18     UserRecords userRecords = new UserRecords();
 19     double balance = 100;
 20     ChargeMode chargeMode;
 21     String number;
 22     
 23     double calBalance()
 24     {
 25         if(number.charAt(0) == '1')
 26         {
 27             
 28             return balance - calCost() - 15;
 29         }
 30         else 
 31         {
 32             return balance - calCost() - 20;
 33         }
 34     }
 35     
 36     double calCost()
 37     {
 38         double j = 0, q = 0;
 39         LandPhonelnCityRule landPhonelnCityRule = new LandPhonelnCityRule();
 40         j = j + landPhonelnCityRule.calCost(userRecords.callinglnCityRecords);
 41         LandPhonelnProvinceRule landPhonelnProvinceRule = new LandPhonelnProvinceRule();
 42         j = j + landPhonelnProvinceRule.calCost(userRecords.callinglnProvinceRecords);
 43         LandPhonelnlandRule landPhonelnlandRule = new LandPhonelnlandRule();
 44         j = j + landPhonelnlandRule.calCost(userRecords.callinglnLandRecords);
 45         if(number.charAt(0) == '1')
 46         {
 47             q = landPhonelnlandRule.anser(userRecords.answerlnLandRecords);
 48             j = j + q;
 49             //System.out.println("接听费用" + q);
 50         }
 51          return j;
 52     }
 53     
 54     UserRecords getUserRecords()
 55     {
 56         
 57         return userRecords;
 58     }
 59     
 60     void setUserRecords(UserRecords userRecords)
 61     {
 62         
 63     }
 64     
 65     double getBalance()
 66     {
 67         
 68         return 0;
 69     }
 70     
 71      ChargeMode getChargeMode()
 72      {
 73          
 74          return chargeMode;
 75      }
 76      
 77      void setChargeMode (ChargeMode chargeMode)
 78      {
 79          
 80      }
 81      
 82      String getNumber()
 83      {
 84          
 85          return number;
 86      }
 87      
 88      void setNumber (String number)
 89      {
 90          this.number = number;
 91      }
 92 }
 93 
 94 abstract class ChargeMode
 95 {
 96      ArrayList<ChargeRule>  chargeRules = new ArrayList<>();
 97     
 98      ArrayList<ChargeRule> getChargeRules()
 99      {
100          return chargeRules;
101      }
102      
103      void setChargeRules (ArrayList<ChargeRule> chargeRules)
104      {
105          this.chargeRules = chargeRules;
106      }
107      
108        abstract double calCost (UserRecords userRecords);
109 
110      
111      abstract double getMonthlyRent();
112 }
113 
114 class LandlinePhoneCharging extends ChargeMode
115 {
116      double monthlyRent= 20;
117      
118      @Override
119      double calCost (UserRecords userRecords)
120      {
121          return 0;
122      }
123      
124      @Override
125      double getMonthlyRent ()
126      {
127          return monthlyRent;
128      }
129 }
130 
131 class UserRecords
132 {
133     ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
134     ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
135     ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
136     ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
137     ArrayList<CallRecord> answerInProvinceRecords  = new ArrayList<CallRecord>();
138     ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
139     ArrayList<MessageRecord> sendMessageRecords =  new ArrayList<MessageRecord>();
140     ArrayList<MessageRecord> receiveMessageRecords =  new ArrayList<MessageRecord>();
141     
142     void addCallinglnCityRecords (CallRecord callRecord)
143     {
144         callinglnCityRecords.add(callRecord);
145     }
146     
147     void addCallingInProvinceRecords (CallRecord callRecord)
148     {
149         callinglnProvinceRecords.add(callRecord);
150     }
151     
152     void addCallinglnLandRecords (CallRecord callRecord)
153     {
154         callinglnLandRecords.add(callRecord);
155     }
156     
157     void addAnswerlnCityRecords (CallRecord answerRecord)
158     {
159         answerlnCityRecords.add(answerRecord);
160     }
161     
162     void addAnswerlnProvinceRecords (CallRecord answerRecord)
163     {
164         answerInProvinceRecords.add(answerRecord);
165     }
166     
167     void addAnswerlnLandRecords (CallRecord answerRecord)
168     {
169         answerlnLandRecords.add(answerRecord);
170     }
171     
172     void addSendMessageRecords (MessageRecord sendMessageRecord)
173     {
174         sendMessageRecords.add(sendMessageRecord);
175     }
176     
177     void addReceiveMessageRecords (MessageRecord receiveMessageRecord)
178     {
179         receiveMessageRecords.add(receiveMessageRecord);
180     }
181     
182      ArrayList<MessageRecord> getSendMessageRecords ()
183      {
184          return sendMessageRecords;
185      }
186      
187      ArrayList<MessageRecord> getReceiveMessageRecords ()
188      {
189          return receiveMessageRecords;
190      }
191      
192      ArrayList<CallRecord> getCallinglnCityRecords()
193      {
194          return callinglnCityRecords;
195      }
196      
197      ArrayList<CallRecord> getCallinglnProvinceRecords()
198      {
199          return callinglnProvinceRecords;
200      }
201      
202      ArrayList<CallRecord> getCallinglnLandRecords()
203      {
204          return  callinglnLandRecords;
205      }
206      
207      ArrayList<CallRecord> getAnswerlnCityRecords ()
208      {
209          return answerlnCityRecords;
210      }
211      
212      ArrayList<CallRecord> getAnswerlnProvinceRecords()
213      {
214          return answerInProvinceRecords;
215      }
216      
217      ArrayList<CallRecord> getAnswerInLandRecords()
218      {
219          return answerlnLandRecords;
220      }
221 }
222 
223 class CallRecord extends CommunicationRecord
224 {
225     Date startTime;
226     Date endTime;
227     String callingAddressAreaCode;
228     String answerAddressAreaCode;
229     
230     Date getStartTime()
231     {
232         return startTime;
233     }
234     
235     void setStartTime (Date startTime)
236     {
237         this.startTime = startTime;
238     }
239     
240     Date getEndTime()
241     {
242         return endTime;
243     }
244     
245     void setEndTime (Date endTime)
246     {
247         this.endTime = endTime;
248     }
249     
250     String getCallingAddressAreaCode()
251     {
252         return callingAddressAreaCode;
253     }
254     
255     void setCallingAddressAreaCode (String callingAddressAreaCode)
256     {
257         this.callingAddressAreaCode = callingAddressAreaCode;
258     }
259     
260     String getAnswerAddressAreaCode()
261     {
262         return answerAddressAreaCode;
263     }
264     
265     void setAnswerAddressAreaCode (String answerAddressAreaCode) 
266     {
267         this.answerAddressAreaCode = answerAddressAreaCode;
268     }
269 }
270 
271 class MessageRecord extends CommunicationRecord
272 {
273     String message;
274     
275     String getMessage()
276     {
277         return message;
278     }
279     
280     void setMessage (String message)
281     {
282         this.message = message;
283     }
284 }
285 
286 abstract class ChargeRule
287 {
288     
289 }
290 
291 abstract class CallChargeRule extends ChargeRule
292 {
293     abstract double  calCost (ArrayList<CallRecord> callRecords);
294 }
295 
296 class LandPhonelnCityRule extends CallChargeRule
297 {
298     @Override
299     double calCost(ArrayList<CallRecord> callRecords)
300     {
301         double j = 0, k = 0, l = 0, cost = 0;
302         if(callRecords.size() > 0)
303         {
304             if(callRecords.get(0).callingNumber.charAt(0) == '1')
305             {
306                 for(int i = 0; i < callRecords.size(); ++i)
307                 {
308                     if(callRecords.get(i).answerAddressAreaCode.equals("0791"))
309                     {
310                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
311                        
312                         long days = diff / (1000 * 60 * 60 * 24);
313 
314                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
315                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
316                         j = days * 24 * 60 + hours * 60 + minutes;
317                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
318                         {
319                             j = j + 1;
320                         }
321                         cost = cost + j / 10;
322                         j = 0;
323                     }
324                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(i).answerAddressAreaCode)) 
325                     {
326                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
327                            
328                         long days = diff / (1000 * 60 * 60 * 24);
329 
330                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
331                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
332                         k = days * 24 * 60 + hours * 60 + minutes;
333                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
334                         {
335                             k = k + 1;
336                         }
337                         cost = cost + 2 * k / 10;
338                         k = 0;
339                     }
340                     else 
341                     {
342                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
343                            
344                         long days = diff / (1000 * 60 * 60 * 24);
345 
346                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
347                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
348                         l = days * 24 * 60 + hours * 60 + minutes;
349                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
350                         {
351                             l = l + 1;
352                         }
353                         cost = cost + 3 * l /10;
354                         l = 0;
355                     }
356                 }
357                 //cost =  j / 10 + 2 * k / 10 + 3 * l /10;
358                 //System.out.println("手机市内拨打的费用" + cost);
359                 return cost;
360             }
361             else 
362             {
363                 for(int i = 0; i < callRecords.size(); ++i)
364                 {
365                     if(callRecords.get(i).answerAddressAreaCode.equals("0791"))
366                     {
367                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
368                            
369                         long days = diff / (1000 * 60 * 60 * 24);
370 
371                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
372                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
373                         j = days * 24 * 60 + hours * 60 + minutes;
374                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
375                         {
376                             j = j + 1;
377                         }
378                         //System.out.println("市内座机拨打" + j/10);
379                         cost = j/10 +cost;
380                         j = 0;
381                     }
382                     else if (Pattern.matches("079[0-9]|0701", callRecords.get(i).answerAddressAreaCode)) 
383                     {
384                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
385                            
386                         long days = diff / (1000 * 60 * 60 * 24);
387 
388                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
389                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
390                         k = days * 24 * 60 + hours * 60 + minutes;
391                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
392                         {
393                             k = k + 1;
394                         }
395                         //System.out.println("省内座机拨打" + k*3/10);
396                         cost =  3*k/10 + cost;
397                         k = 0;
398                     }
399                     else
400                     {
401                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
402                            
403                         long days = diff / (1000 * 60 * 60 * 24);
404 
405                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
406                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
407                         l = days * 24 * 60 + hours * 60 + minutes;
408                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
409                         {
410                             l = l + 1;
411                         }
412                         //System.out.println("省外座机拨打" + l*6/10);
413                         cost = cost + l*6/10;
414                         l = 0;
415                     }
416                     //cost = j/10 + 3*k/10 + 6*l/10;
417                     //System.out.println(cost);
418                 }
419                 return cost;
420             }
421         }
422         else 
423         {
424             //System.out.println("该号码没有市内拨号");
425             return 0;
426         }
427     
428     }
429 }
430 
431 class LandPhonelnlandRule extends CallChargeRule
432 {
433     @Override
434     double  calCost (ArrayList<CallRecord> callRecords)
435     {
436         double j = 0, cost = 0;
437         if(callRecords.size() > 0)
438         {
439                 for(int i = 0; i < callRecords.size(); ++i)
440                 {
441                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
442                        
443                     long days = diff / (1000 * 60 * 60 * 24);
444 
445                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
446                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
447                     j = days * 24 * 60 + hours * 60 + minutes;
448                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
449                     {
450                         j = j + 1;
451                     }
452                     cost = 6 * j / 10;
453                     j = 0;
454                 }
455                     //cost = 6 * j / 10;
456                 //System.out.println("省外拨打的费用" + cost);
457                 return cost;
458         }
459         else 
460         {
461             //System.out.println("该号码没有省内拨号");
462             return 0;
463         }
464         
465     }
466     
467     double anser(ArrayList<CallRecord> callRecords)
468     {
469         double j = 0, cost = 0;
470         if(callRecords.size() > 0)
471         {
472                 for(int i = 0; i < callRecords.size(); ++i)
473                 {
474                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
475                        
476                     long days = diff / (1000 * 60 * 60 * 24);
477 
478                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
479                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
480                     j = days * 24 * 60 + hours * 60 + minutes;
481                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
482                     {
483                         j = j + 1;
484                     }
485                     cost = 3 * j /10;
486                     j = 0;
487                 }
488                 
489                 return cost;
490         }
491         else 
492         {
493             //System.out.println("没有省外接听记录");
494             return 0;
495         }
496     }
497 }
498 
499 class LandPhonelnProvinceRule extends CallChargeRule
500 {
501     @Override
502     double calCost(ArrayList<CallRecord> callRecords)
503     {
504         double j = 0, cost = 0;
505         
506         if(callRecords.size() > 0)
507         {
508                 for(int i = 0; i < callRecords.size(); ++i)
509                 {
510                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
511                        
512                     long days = diff / (1000 * 60 * 60 * 24);
513 
514                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
515                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
516                     j = days * 24 * 60 + hours * 60 + minutes;
517                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
518                     {
519                         j = j + 1;
520                     }
521                     cost = 3 * j / 10;
522                     j = 0;
523                 }
524                 //cost = 3 * j / 10;
525                 //System.out.println("省内拨打的费用" + cost);
526                 return cost;
527         }
528         else 
529         {
530             //System.out.println("没有省内拨打记录");
531             return 0;
532         }
533         
534     }
535 }
536 
537 abstract class CommunicationRecord
538 {
539     String callingNumber;
540     String answerNumber;
541     
542     String getCallingNumber()
543     {
544         return callingNumber;
545     }
546     
547     void setCallingNumber (String callingNumber)
548     {
549         this.callingNumber = callingNumber;
550     }
551     
552     String getAnswerNumber()
553     {
554         return answerNumber;
555     }
556     
557     void setAnswerNumber (String answeriNumber)
558     {
559         this.answerNumber = answeriNumber;
560     }
561 }
562 
563 
564 public class Main 
565 {
566     public static void main(String[] args) throws ParseException 
567     {
568         ArrayList<String> list = new ArrayList<String>();
569         ArrayList<String> list1 = new ArrayList<String>();
570         ArrayList<String> list2 = new ArrayList<String>();
571         ArrayList<String> list3 = new ArrayList<String>();
572         ArrayList<String> list4 = new ArrayList<String>();
573         ArrayList<User> U = new ArrayList<User>();
574         ArrayList<CallRecord> callRecords = new ArrayList<CallRecord>();
575         Scanner sc = new Scanner(System.in);
576         String line = null;
577         
578         while(!"end".equals(line = sc.nextLine())){
579             list.add(line);
580         }
581         sc.close();
582         
583         //判断开户信息保并保存到存到list1容器中
584         
585         for(int i = 0; i < list.size(); ++i)
586         {
587             if(Pattern.matches("u-(0[0-9]{9,11}|1[0-9]{10}) [01]", list.get(i)))
588             {
589                 list4.add(list.get(i));
590             }
591         }
592         
593         //判断是否有号码重复
594 //        for(int w = 0; w < list4.size() - 1; ++w)
595 //        {
596 //            for(int x = w + 1; x < list4.size(); ++x)
597 //            {
598 //                if(list4.get(w).equals(list4.get(x)))
599 //                {
600 //                    list4.remove(x);
601 //                }
602 //            }
603 //        }
604         
605         for(int b = 0; b < list4.size(); b++)
606         {
607             if(list4.get(b).charAt(2) == '0')
608             {
609                 list1.add(list4.get(b));//将座机用户保存到list1中
610             }
611             else 
612             {
613                 list3.add(list4.get(b));//将手机用户保存到list3中
614             }
615         }
616         //给座机的次序排位
617         Collections.sort(list1);
618         //给电话的次序排位
619         Collections.sort(list3);
620         
621         
622         //从list1容器中提取座机号码并保存到新建的user容器中
623         Pattern p1=Pattern.compile("07[0-9]*");
624         for(int k = 0; k < list1.size(); ++k)
625         {
626             Matcher m1 = p1.matcher(list1.get(k));
627             while(m1.find())
628             {
629                 User u = new User();
630                 u.number = m1.group(0);
631                 U.add(u);
632             }
633         }
634         Pattern p2=Pattern.compile("1[0-9]{10}");
635         for(int q = 0; q < list3.size(); ++q)
636         {
637             Matcher m2 = p2.matcher(list3.get(q));
638             while(m2.find())
639             {
640                 User u = new User();
641                 u.number = m2.group(0);
642                 U.add(u);
643             }
644         }
645         
646         //判断user中是否有重复的号码
647         for(int w = 0; w < U.size() - 1; ++w)
648             {
649                 for(int x = w + 1; x < U.size(); ++x)
650                 {
651                     if(U.get(w).number.equals(U.get(x).number))
652                     {
653                         U.remove(x);
654                     }
655                 }
656             }
657         
658         
659         //把拨号信息存入到list2中去
660             for(int h = 0; h < list.size(); ++h)
661             {
662                 if( list.get(h).charAt(0) == 't')
663                 {
664                     list2.add(list.get(h));
665                 }
666             }
667         
668         int n1 = 0, n2 = 0;
669         //判断拨号信息是否符合格式
670         String time = "[0-9]{4}\\.(([1-9])|(1[0-2]))\\.(([1-9])|((1|2)[0-9])|30|31) (((0|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])";
671         String MobliePhoneNumber = "1[0-9]{10}";
672         String LandPhoneNumber = "[0-9]{7,8}";
673         String code = "0[0-9]{2,3}";
674         for(int e1 = 0; e1 < list2.size(); ++e1)
675         {
676             if(list2.get(e1).matches("t-"+code+LandPhoneNumber+" "+code+LandPhoneNumber+" "+time+" "+time)) {
677                 
678             }
679             else if(list2.get(e1).matches("t-"+code+LandPhoneNumber+" "+MobliePhoneNumber+" "+code+" "+time+" "+time)){
680                 
681             }
682             else if(list2.get(e1).matches("t-"+MobliePhoneNumber+" "+code+" "+code+LandPhoneNumber+" "+time+" "+time)) {
683                 
684             }
685             else if(list2.get(e1).matches("t-"+MobliePhoneNumber+" "+code+" "+MobliePhoneNumber+" "+code+" "+time+" "+time)) {
686                
687             }
688             else
689             {
690                 list2.remove(e1);
691                 e1 = e1 -1;
692             }
693         }
694         //拨号信息的提取并保存到callRecords容器中
695         SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
696         String startTime = null;
697         String endTime = null;
698         for(int z = 0; z < list2.size(); ++z)
699         {
700             String[] arithArray = list2.get(z).split(" ");
701             if(arithArray[0].charAt(2) == '1')
702             {
703                 if(arithArray[2].charAt(0) == '1')
704                 {
705                     startTime = arithArray[4] + " " + arithArray[5];
706                     endTime = arithArray[6] + " " + arithArray[7];
707                     CallRecord callRecord = new CallRecord();
708                     callRecord.callingNumber = arithArray[0].replace("t-", "");
709                     callRecord.answerNumber = arithArray[2];
710                     callRecord.startTime = df.parse(startTime);
711                     callRecord.endTime = df.parse(endTime);
712                     callRecord.callingAddressAreaCode = arithArray[1];
713                     callRecord.answerAddressAreaCode = arithArray[3];
714                     callRecords.add(callRecord);
715                 }
716                 else 
717                 {
718                     startTime = arithArray[3] + " " + arithArray[4];
719                     endTime = arithArray[5] + " " + arithArray[6];
720                     CallRecord callRecord = new CallRecord();
721                     callRecord.callingNumber = arithArray[0].replace("t-", "");
722                     callRecord.answerNumber = arithArray[2];
723                     callRecord.startTime = df.parse(startTime);
724                     callRecord.endTime = df.parse(endTime);
725                     callRecord.callingAddressAreaCode = arithArray[1];
726                     callRecord.answerAddressAreaCode = callRecord.answerNumber.substring(0,4);
727                     callRecords.add(callRecord);
728                 }
729             }
730             else 
731             {
732                 if(arithArray[1].charAt(0) == '1')
733                 {
734                     startTime = arithArray[3] + " " + arithArray[4];
735                     endTime = arithArray[5] + " " + arithArray[6];
736                     CallRecord callRecord = new CallRecord();
737                     callRecord.callingNumber = arithArray[0].replace("t-", "");
738                     callRecord.answerNumber = arithArray[1];
739                     callRecord.startTime = df.parse(startTime);
740                     callRecord.endTime = df.parse(endTime);
741                     callRecord.callingAddressAreaCode = callRecord.callingNumber.substring(0,4);
742                     callRecord.answerAddressAreaCode = arithArray[2];
743                     callRecords.add(callRecord);
744                 }
745                 else 
746                 {
747                     startTime = arithArray[2] + " " + arithArray[3];
748                     endTime = arithArray[4] + " " + arithArray[5];
749                     CallRecord callRecord = new CallRecord();
750                     callRecord.callingNumber = arithArray[0].replace("t-", "");
751                     callRecord.answerNumber = arithArray[1];
752                     callRecord.startTime = df.parse(startTime);
753                     callRecord.endTime = df.parse(endTime);
754                     callRecord.callingAddressAreaCode = callRecord.callingNumber.substring(0,4);
755                     callRecord.answerAddressAreaCode = callRecord.answerNumber.substring(0,4);
756                     callRecords.add(callRecord);
757                 }
758             }
759         }
760         
761         
762         //判断拨号信息类型并被已有帐户的用户记录所保存
763         for(int n = 0; n < callRecords.size(); ++n)
764         {
765             for(int y = 0; y < U.size(); ++y)
766             {
767                 if(callRecords.get(n).callingNumber.equals(U.get(y).number))
768                 {
769                     if(callRecords.get(n).callingAddressAreaCode.equals("0791"))
770                     {
771                         U.get(y).userRecords.addCallinglnCityRecords(callRecords.get(n));    
772                     }
773                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(n).callingAddressAreaCode))
774                     {
775                         U.get(y).userRecords.addCallingInProvinceRecords(callRecords.get(n));
776                     }
777                     else
778                     {
779                         U.get(y).userRecords.addCallinglnLandRecords(callRecords.get(n));
780                     }
781                 }
782                 if(callRecords.get(n).answerNumber.equals(U.get(y).number))
783                 {
784                     if(callRecords.get(n).answerAddressAreaCode.equals("0791"))
785                     {
786                         U.get(y).userRecords.addAnswerlnCityRecords(callRecords.get(n));
787                     }
788                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(n).answerAddressAreaCode))
789                     {
790                         U.get(y).userRecords.addAnswerlnProvinceRecords(callRecords.get(n));
791                     }
792                     else 
793                     {
794                         U.get(y).userRecords.addAnswerlnLandRecords(callRecords.get(n));
795                     }
796                 }
797             }
798         }
799         
800         //输出目的  需修改输出的次序
801         for(int o = 0; o < U.size(); ++o)
802         {
803             //System.out.println(U.get(o).number);
804             System.out.println(U.get(o).number + " " +  U.get(o).calCost() + " " + U.get(o).calBalance());
805         }
806     }
807 }

 

 

 

 

对于此题,我的思路是按照老师的建议类图来创建相关类,在主函数中先是创建了5个String类型,1个自定义类User类型,1个自定义类CallRecord类型的容器用来保存接下来的数据。然后调用Scanner类并创建对象来获取用户从键盘上输入的全部数据,并存入第一个String类型的容器中去。之后再用正则表达式u-(0[0-9]{9,11}|1[0-9]{10}) [01]来对第一个String类型的容器的数据进行提取号码有效数据保存到第二个String类型的容器。之后String time = "[0-9]{4}\\.(([1-9])|(1[0-2]))\\.(([1-9])|((1|2)[0-9])|30|31) (((0|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])"; String LandPhoneNumber = "[0-9]{7,8}";,两项正则表达式来对第一个String类型的容器的数据进行一个拨号信息的有效提取,最后得到有效数据存入到User类和CallRecord类容器中去。在对其进行相关匹配。得到一个个完全体数据结构,传入的相应的函数进行计算求和。在对求和类中利用到了Data类型的运算,来计算出拨打电话的时间。随后一个个的计算出各条数据所对应的费用,最后在进行相加。

 

对于此题我认为除去对类的一个全体的把控,正则表达式也是一个比较难把握的一个点。需要对其进行一个数据测试来验证是否真的可以剔除无效数据。

 

通过此题让我充分了解到Data数据类型实现了从一无所知到熟悉了它的具体用法

题目集7   7-1

  1 import java.text.ParseException;
  2 import java.util.Date;
  3 import java.util.Iterator;
  4 import java.util.ArrayList;
  5 import java.util.Scanner;
  6 import java.util.regex.Pattern;
  7 import java.util.regex.Matcher;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Collections;
 10 
 11 
 12 class User
 13 {
 14     UserRecords userRecords = new UserRecords();
 15     double balance = 100;
 16     ChargeMode chargeMode;
 17     String number;
 18     
 19     double calBalance()
 20     {
 21         if(number.charAt(0) == '1')
 22         {
 23             
 24             return balance - calCost() - 15;
 25         }
 26         else 
 27         {
 28             return balance - calCost() - 20;
 29         }
 30     }
 31     
 32     double calCost()
 33     {
 34         double j = 0, q = 0;
 35         LandPhonelnCityRule landPhonelnCityRule = new LandPhonelnCityRule();
 36         j = j + landPhonelnCityRule.calCost(userRecords.callinglnCityRecords);
 37         LandPhonelnProvinceRule landPhonelnProvinceRule = new LandPhonelnProvinceRule();
 38         j = j + landPhonelnProvinceRule.calCost(userRecords.callinglnProvinceRecords);
 39         LandPhonelnlandRule landPhonelnlandRule = new LandPhonelnlandRule();
 40         j = j + landPhonelnlandRule.calCost(userRecords.callinglnLandRecords);
 41         if(number.charAt(0) == '1')
 42         {
 43             q = landPhonelnlandRule.anser(userRecords.answerlnLandRecords);
 44             j = j + q;
 45             //System.out.println("接听费用" + q);
 46         }
 47          return j;
 48     }
 49     
 50     UserRecords getUserRecords()
 51     {
 52         
 53         return userRecords;
 54     }
 55     
 56     void setUserRecords(UserRecords userRecords)
 57     {
 58         
 59     }
 60     
 61     double getBalance()
 62     {
 63         
 64         return 0;
 65     }
 66     
 67      ChargeMode getChargeMode()
 68      {
 69          
 70          return chargeMode;
 71      }
 72      
 73      void setChargeMode (ChargeMode chargeMode)
 74      {
 75          
 76      }
 77      
 78      String getNumber()
 79      {
 80          
 81          return number;
 82      }
 83      
 84      void setNumber (String number)
 85      {
 86          this.number = number;
 87      }
 88 }
 89 
 90 abstract class ChargeMode
 91 {
 92      ArrayList<ChargeRule>  chargeRules = new ArrayList<>();
 93     
 94      ArrayList<ChargeRule> getChargeRules()
 95      {
 96          return chargeRules;
 97      }
 98      
 99      void setChargeRules (ArrayList<ChargeRule> chargeRules)
100      {
101          this.chargeRules = chargeRules;
102      }
103      
104        abstract double calCost (UserRecords userRecords);
105 
106      
107      abstract double getMonthlyRent();
108 }
109 
110 class LandlinePhoneCharging extends ChargeMode
111 {
112      double monthlyRent= 20;
113      
114      @Override
115      double calCost (UserRecords userRecords)
116      {
117          return 0;
118      }
119      
120      @Override
121      double getMonthlyRent ()
122      {
123          return monthlyRent;
124      }
125 }
126 
127 class UserRecords
128 {
129     ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
130     ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
131     ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
132     ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
133     ArrayList<CallRecord> answerInProvinceRecords  = new ArrayList<CallRecord>();
134     ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
135     ArrayList<MessageRecord> sendMessageRecords =  new ArrayList<MessageRecord>();
136     ArrayList<MessageRecord> receiveMessageRecords =  new ArrayList<MessageRecord>();
137     
138     void addCallinglnCityRecords (CallRecord callRecord)
139     {
140         callinglnCityRecords.add(callRecord);
141     }
142     
143     void addCallingInProvinceRecords (CallRecord callRecord)
144     {
145         callinglnProvinceRecords.add(callRecord);
146     }
147     
148     void addCallinglnLandRecords (CallRecord callRecord)
149     {
150         callinglnLandRecords.add(callRecord);
151     }
152     
153     void addAnswerlnCityRecords (CallRecord answerRecord)
154     {
155         answerlnCityRecords.add(answerRecord);
156     }
157     
158     void addAnswerlnProvinceRecords (CallRecord answerRecord)
159     {
160         answerInProvinceRecords.add(answerRecord);
161     }
162     
163     void addAnswerlnLandRecords (CallRecord answerRecord)
164     {
165         answerlnLandRecords.add(answerRecord);
166     }
167     
168     void addSendMessageRecords (MessageRecord sendMessageRecord)
169     {
170         sendMessageRecords.add(sendMessageRecord);
171     }
172     
173     void addReceiveMessageRecords (MessageRecord receiveMessageRecord)
174     {
175         receiveMessageRecords.add(receiveMessageRecord);
176     }
177     
178      ArrayList<MessageRecord> getSendMessageRecords ()
179      {
180          return sendMessageRecords;
181      }
182      
183      ArrayList<MessageRecord> getReceiveMessageRecords ()
184      {
185          return receiveMessageRecords;
186      }
187      
188      ArrayList<CallRecord> getCallinglnCityRecords()
189      {
190          return callinglnCityRecords;
191      }
192      
193      ArrayList<CallRecord> getCallinglnProvinceRecords()
194      {
195          return callinglnProvinceRecords;
196      }
197      
198      ArrayList<CallRecord> getCallinglnLandRecords()
199      {
200          return  callinglnLandRecords;
201      }
202      
203      ArrayList<CallRecord> getAnswerlnCityRecords ()
204      {
205          return answerlnCityRecords;
206      }
207      
208      ArrayList<CallRecord> getAnswerlnProvinceRecords()
209      {
210          return answerInProvinceRecords;
211      }
212      
213      ArrayList<CallRecord> getAnswerInLandRecords()
214      {
215          return answerlnLandRecords;
216      }
217 }
218 
219 class CallRecord extends CommunicationRecord
220 {
221     Date startTime;
222     Date endTime;
223     String callingAddressAreaCode;
224     String answerAddressAreaCode;
225     
226     Date getStartTime()
227     {
228         return startTime;
229     }
230     
231     void setStartTime (Date startTime)
232     {
233         this.startTime = startTime;
234     }
235     
236     Date getEndTime()
237     {
238         return endTime;
239     }
240     
241     void setEndTime (Date endTime)
242     {
243         this.endTime = endTime;
244     }
245     
246     String getCallingAddressAreaCode()
247     {
248         return callingAddressAreaCode;
249     }
250     
251     void setCallingAddressAreaCode (String callingAddressAreaCode)
252     {
253         this.callingAddressAreaCode = callingAddressAreaCode;
254     }
255     
256     String getAnswerAddressAreaCode()
257     {
258         return answerAddressAreaCode;
259     }
260     
261     void setAnswerAddressAreaCode (String answerAddressAreaCode) 
262     {
263         this.answerAddressAreaCode = answerAddressAreaCode;
264     }
265 }
266 
267 class MessageRecord extends CommunicationRecord
268 {
269     String message;
270     
271     String getMessage()
272     {
273         return message;
274     }
275     
276     void setMessage (String message)
277     {
278         this.message = message;
279     }
280 }
281 
282 abstract class ChargeRule
283 {
284     
285 }
286 
287 abstract class CallChargeRule extends ChargeRule
288 {
289     abstract double  calCost (ArrayList<CallRecord> callRecords);
290 }
291 
292 class LandPhonelnCityRule extends CallChargeRule
293 {
294     @Override
295     double calCost(ArrayList<CallRecord> callRecords)
296     {
297         double j = 0, k = 0, l = 0, cost = 0;
298         if(callRecords.size() > 0)
299         {
300             if(callRecords.get(0).callingNumber.charAt(0) == '1')
301             {
302                 for(int i = 0; i < callRecords.size(); ++i)
303                 {
304                     if(callRecords.get(i).answerAddressAreaCode.equals("0791"))
305                     {
306                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
307                        
308                         long days = diff / (1000 * 60 * 60 * 24);
309 
310                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
311                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
312                         j = days * 24 * 60 + hours * 60 + minutes;
313                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
314                         {
315                             j = j + 1;
316                         }
317                         cost = cost + j / 10;
318                         j = 0;
319                     }
320                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(i).answerAddressAreaCode)) 
321                     {
322                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
323                            
324                         long days = diff / (1000 * 60 * 60 * 24);
325 
326                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
327                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
328                         k = days * 24 * 60 + hours * 60 + minutes;
329                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
330                         {
331                             k = k + 1;
332                         }
333                         cost = cost + 2 * k / 10;
334                         k = 0;
335                     }
336                     else 
337                     {
338                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
339                            
340                         long days = diff / (1000 * 60 * 60 * 24);
341 
342                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
343                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
344                         l = days * 24 * 60 + hours * 60 + minutes;
345                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
346                         {
347                             l = l + 1;
348                         }
349                         cost = cost + 3 * l /10;
350                         l = 0;
351                     }
352                 }
353                 //cost =  j / 10 + 2 * k / 10 + 3 * l /10;
354                 //System.out.println("手机市内拨打的费用" + cost);
355                 return cost;
356             }
357             else 
358             {
359                 for(int i = 0; i < callRecords.size(); ++i)
360                 {
361                     if(callRecords.get(i).answerAddressAreaCode.equals("0791"))
362                     {
363                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
364                            
365                         long days = diff / (1000 * 60 * 60 * 24);
366 
367                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
368                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
369                         j = days * 24 * 60 + hours * 60 + minutes;
370                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
371                         {
372                             j = j + 1;
373                         }
374                         //System.out.println("市内座机拨打" + j/10);
375                         cost = j/10 +cost;
376                         j = 0;
377                     }
378                     else if (Pattern.matches("079[0-9]|0701", callRecords.get(i).answerAddressAreaCode)) 
379                     {
380                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
381                            
382                         long days = diff / (1000 * 60 * 60 * 24);
383 
384                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
385                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
386                         k = days * 24 * 60 + hours * 60 + minutes;
387                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
388                         {
389                             k = k + 1;
390                         }
391                         //System.out.println("省内座机拨打" + k*3/10);
392                         cost =  3*k/10 + cost;
393                         k = 0;
394                     }
395                     else
396                     {
397                         long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
398                            
399                         long days = diff / (1000 * 60 * 60 * 24);
400 
401                         long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
402                         long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
403                         l = days * 24 * 60 + hours * 60 + minutes;
404                         if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
405                         {
406                             l = l + 1;
407                         }
408                         //System.out.println("省外座机拨打" + l*6/10);
409                         cost = cost + l*6/10;
410                         l = 0;
411                     }
412                     //cost = j/10 + 3*k/10 + 6*l/10;
413                     //System.out.println(cost);
414                 }
415                 return cost;
416             }
417         }
418         else 
419         {
420             //System.out.println("该号码没有市内拨号");
421             return 0;
422         }
423     
424     }
425 }
426 
427 class LandPhonelnlandRule extends CallChargeRule
428 {
429     @Override
430     double  calCost (ArrayList<CallRecord> callRecords)
431     {
432         double j = 0, cost = 0;
433         if(callRecords.size() > 0)
434         {
435                 for(int i = 0; i < callRecords.size(); ++i)
436                 {
437                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
438                        
439                     long days = diff / (1000 * 60 * 60 * 24);
440 
441                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
442                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
443                     j = days * 24 * 60 + hours * 60 + minutes;
444                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
445                     {
446                         j = j + 1;
447                     }
448                     cost = 6 * j / 10;
449                     j = 0;
450                 }
451                     //cost = 6 * j / 10;
452                 //System.out.println("省外拨打的费用" + cost);
453                 return cost;
454         }
455         else 
456         {
457             //System.out.println("该号码没有省内拨号");
458             return 0;
459         }
460         
461     }
462     
463     double anser(ArrayList<CallRecord> callRecords)
464     {
465         double j = 0, cost = 0;
466         if(callRecords.size() > 0)
467         {
468                 for(int i = 0; i < callRecords.size(); ++i)
469                 {
470                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
471                        
472                     long days = diff / (1000 * 60 * 60 * 24);
473 
474                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
475                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
476                     j = days * 24 * 60 + hours * 60 + minutes;
477                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
478                     {
479                         j = j + 1;
480                     }
481                     cost = 3 * j /10;
482                     j = 0;
483                 }
484                 
485                 return cost;
486         }
487         else 
488         {
489             //System.out.println("没有省外接听记录");
490             return 0;
491         }
492     }
493 }
494 
495 class LandPhonelnProvinceRule extends CallChargeRule
496 {
497     @Override
498     double calCost(ArrayList<CallRecord> callRecords)
499     {
500         double j = 0, cost = 0;
501         
502         if(callRecords.size() > 0)
503         {
504                 for(int i = 0; i < callRecords.size(); ++i)
505                 {
506                     long diff = callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime();//这样得到的差值是毫秒级别
507                        
508                     long days = diff / (1000 * 60 * 60 * 24);
509 
510                     long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);
511                     long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);
512                     j = days * 24 * 60 + hours * 60 + minutes;
513                     if( (((callRecords.get(i).endTime.getTime() - callRecords.get(i).startTime.getTime()) / 1000) % 60) >= 1 )
514                     {
515                         j = j + 1;
516                     }
517                     cost = 3 * j / 10;
518                     j = 0;
519                 }
520                 //cost = 3 * j / 10;
521                 //System.out.println("省内拨打的费用" + cost);
522                 return cost;
523         }
524         else 
525         {
526             //System.out.println("没有省内拨打记录");
527             return 0;
528         }
529         
530     }
531 }
532 
533 abstract class CommunicationRecord
534 {
535     String callingNumber;
536     String answerNumber;
537     
538     String getCallingNumber()
539     {
540         return callingNumber;
541     }
542     
543     void setCallingNumber (String callingNumber)
544     {
545         this.callingNumber = callingNumber;
546     }
547     
548     String getAnswerNumber()
549     {
550         return answerNumber;
551     }
552     
553     void setAnswerNumber (String answeriNumber)
554     {
555         this.answerNumber = answeriNumber;
556     }
557 }
558 
559 
560 public class Main 
561 {
562     public static void main(String[] args) throws ParseException 
563     {
564         ArrayList<String> list = new ArrayList<String>();
565         ArrayList<String> list1 = new ArrayList<String>();
566         ArrayList<String> list2 = new ArrayList<String>();
567         ArrayList<String> list3 = new ArrayList<String>();
568         ArrayList<String> list4 = new ArrayList<String>();
569         ArrayList<User> U = new ArrayList<User>();
570         ArrayList<CallRecord> callRecords = new ArrayList<CallRecord>();
571         Scanner sc = new Scanner(System.in);
572         String line = null;
573         
574         while(!"end".equals(line = sc.nextLine())){
575             list.add(line);
576         }
577         sc.close();
578         
579         //判断开户信息保并保存到存到list1容器中
580         
581         for(int i = 0; i < list.size(); ++i)
582         {
583             if(Pattern.matches("u-(0[0-9]{9,11}|1[0-9]{10}) [01]", list.get(i)))
584             {
585                 list4.add(list.get(i));
586             }
587         }
588         
589         //判断是否有号码重复
590 //        for(int w = 0; w < list4.size() - 1; ++w)
591 //        {
592 //            for(int x = w + 1; x < list4.size(); ++x)
593 //            {
594 //                if(list4.get(w).equals(list4.get(x)))
595 //                {
596 //                    list4.remove(x);
597 //                }
598 //            }
599 //        }
600         
601         for(int b = 0; b < list4.size(); b++)
602         {
603             if(list4.get(b).charAt(2) == '0')
604             {
605                 list1.add(list4.get(b));//将座机用户保存到list1中
606             }
607             else 
608             {
609                 list3.add(list4.get(b));//将手机用户保存到list3中
610             }
611         }
612         //给座机的次序排位
613         Collections.sort(list1);
614         //给电话的次序排位
615         Collections.sort(list3);
616         
617         
618         //从list1容器中提取座机号码并保存到新建的user容器中
619         Pattern p1=Pattern.compile("07[0-9]*");
620         for(int k = 0; k < list1.size(); ++k)
621         {
622             Matcher m1 = p1.matcher(list1.get(k));
623             while(m1.find())
624             {
625                 User u = new User();
626                 u.number = m1.group(0);
627                 U.add(u);
628             }
629         }
630         Pattern p2=Pattern.compile("1[0-9]{10}");
631         for(int q = 0; q < list3.size(); ++q)
632         {
633             Matcher m2 = p2.matcher(list3.get(q));
634             while(m2.find())
635             {
636                 User u = new User();
637                 u.number = m2.group(0);
638                 U.add(u);
639             }
640         }
641         
642         //判断user中是否有重复的号码
643         for(int w = 0; w < U.size() - 1; ++w)
644             {
645                 for(int x = w + 1; x < U.size(); ++x)
646                 {
647                     if(U.get(w).number.equals(U.get(x).number))
648                     {
649                         U.remove(x);
650                     }
651                 }
652             }
653         
654         
655         //把拨号信息存入到list2中去
656             for(int h = 0; h < list.size(); ++h)
657             {
658                 if( list.get(h).charAt(0) == 't')
659                 {
660                     list2.add(list.get(h));
661                 }
662             }
663         
664         int n1 = 0, n2 = 0;
665         //判断拨号信息是否符合格式(暂时有误)!!
666         String time = "[0-9]{4}\\.(([1-9])|(1[0-2]))\\.(([1-9])|((1|2)[0-9])|30|31) (((0|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])";
667         String MobliePhoneNumber = "1[0-9]{10}";
668         String LandPhoneNumber = "[0-9]{7,8}";
669         String code = "0[0-9]{2,3}";
670         for(int e1 = 0; e1 < list2.size(); ++e1)
671         {
672             if(list2.get(e1).matches("t-"+code+LandPhoneNumber+" "+code+LandPhoneNumber+" "+time+" "+time)) {
673                 
674             }
675             else if(list2.get(e1).matches("t-"+code+LandPhoneNumber+" "+MobliePhoneNumber+" "+code+" "+time+" "+time)){
676                 
677             }
678             else if(list2.get(e1).matches("t-"+MobliePhoneNumber+" "+code+" "+code+LandPhoneNumber+" "+time+" "+time)) {
679                 
680             }
681             else if(list2.get(e1).matches("t-"+MobliePhoneNumber+" "+code+" "+MobliePhoneNumber+" "+code+" "+time+" "+time)) {
682                
683             }
684             else
685             {
686                 list2.remove(e1);
687                 e1 = e1 -1;
688             }
689         }
690         //拨号信息的提取并保存到callRecords容器中
691         SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
692         String startTime = null;
693         String endTime = null;
694         for(int z = 0; z < list2.size(); ++z)
695         {
696             String[] arithArray = list2.get(z).split(" ");
697             if(arithArray[0].charAt(2) == '1')
698             {
699                 if(arithArray[2].charAt(0) == '1')
700                 {
701                     startTime = arithArray[4] + " " + arithArray[5];
702                     endTime = arithArray[6] + " " + arithArray[7];
703                     CallRecord callRecord = new CallRecord();
704                     callRecord.callingNumber = arithArray[0].replace("t-", "");
705                     callRecord.answerNumber = arithArray[2];
706                     callRecord.startTime = df.parse(startTime);
707                     callRecord.endTime = df.parse(endTime);
708                     callRecord.callingAddressAreaCode = arithArray[1];
709                     callRecord.answerAddressAreaCode = arithArray[3];
710                     callRecords.add(callRecord);
711                 }
712                 else 
713                 {
714                     startTime = arithArray[3] + " " + arithArray[4];
715                     endTime = arithArray[5] + " " + arithArray[6];
716                     CallRecord callRecord = new CallRecord();
717                     callRecord.callingNumber = arithArray[0].replace("t-", "");
718                     callRecord.answerNumber = arithArray[2];
719                     callRecord.startTime = df.parse(startTime);
720                     callRecord.endTime = df.parse(endTime);
721                     callRecord.callingAddressAreaCode = arithArray[1];
722                     callRecord.answerAddressAreaCode = callRecord.answerNumber.substring(0,4);
723                     callRecords.add(callRecord);
724                 }
725             }
726             else 
727             {
728                 if(arithArray[1].charAt(0) == '1')
729                 {
730                     startTime = arithArray[3] + " " + arithArray[4];
731                     endTime = arithArray[5] + " " + arithArray[6];
732                     CallRecord callRecord = new CallRecord();
733                     callRecord.callingNumber = arithArray[0].replace("t-", "");
734                     callRecord.answerNumber = arithArray[1];
735                     callRecord.startTime = df.parse(startTime);
736                     callRecord.endTime = df.parse(endTime);
737                     callRecord.callingAddressAreaCode = callRecord.callingNumber.substring(0,4);
738                     callRecord.answerAddressAreaCode = arithArray[2];
739                     callRecords.add(callRecord);
740                 }
741                 else 
742                 {
743                     startTime = arithArray[2] + " " + arithArray[3];
744                     endTime = arithArray[4] + " " + arithArray[5];
745                     CallRecord callRecord = new CallRecord();
746                     callRecord.callingNumber = arithArray[0].replace("t-", "");
747                     callRecord.answerNumber = arithArray[1];
748                     callRecord.startTime = df.parse(startTime);
749                     callRecord.endTime = df.parse(endTime);
750                     callRecord.callingAddressAreaCode = callRecord.callingNumber.substring(0,4);
751                     callRecord.answerAddressAreaCode = callRecord.answerNumber.substring(0,4);
752                     callRecords.add(callRecord);
753                 }
754             }
755         }
756         
757         
758         //判断拨号信息类型并被已有帐户的用户记录所保存
759         for(int n = 0; n < callRecords.size(); ++n)
760         {
761             for(int y = 0; y < U.size(); ++y)
762             {
763                 if(callRecords.get(n).callingNumber.equals(U.get(y).number))
764                 {
765                     if(callRecords.get(n).callingAddressAreaCode.equals("0791"))
766                     {
767                         U.get(y).userRecords.addCallinglnCityRecords(callRecords.get(n));    
768                     }
769                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(n).callingAddressAreaCode))
770                     {
771                         U.get(y).userRecords.addCallingInProvinceRecords(callRecords.get(n));
772                     }
773                     else
774                     {
775                         U.get(y).userRecords.addCallinglnLandRecords(callRecords.get(n));
776                     }
777                 }
778                 if(callRecords.get(n).answerNumber.equals(U.get(y).number))
779                 {
780                     if(callRecords.get(n).answerAddressAreaCode.equals("0791"))
781                     {
782                         U.get(y).userRecords.addAnswerlnCityRecords(callRecords.get(n));
783                     }
784                     else if(Pattern.matches("079[0-9]|0701", callRecords.get(n).answerAddressAreaCode))
785                     {
786                         U.get(y).userRecords.addAnswerlnProvinceRecords(callRecords.get(n));
787                     }
788                     else 
789                     {
790                         U.get(y).userRecords.addAnswerlnLandRecords(callRecords.get(n));
791                     }
792                 }
793             }
794         }
795         
796         //输出目的  需修改输出的次序
797         for(int o = 0; o < U.size(); ++o)
798         {
799             //System.out.println(U.get(o).number);
800             System.out.println(U.get(o).number + " " +  U.get(o).calCost() + " " + U.get(o).calBalance());
801         }
802     }
803 }

 

 此题是对于上一题的一个拓展,这就体现了优质代码的可拓展性。相对于上一题,修改了计算相关类的一些判定,用来判断座机拨打电话与手机拨打电话。在主函数中额外添加正则表达式String LandPhoneNumber = "[0-9]{7,8}";

        String code = "0[0-9]{2,3}";

来判定拨打电话数据的格式是否正确。

还是正则表达式的问题,再此题中需要判断手机的格式和手机拨打座机,手机拨打手机,座机拨打手机等。需要大量的数据测试。

对于这题让我充分意识到了好的代码是具有优良的可拓展性,虽然开始构建框架是比较难的,但是在此基础上拓展的时候就体现了类的设计优良的优点了

题目集8   7-1

  1 import java.text.ParseException;
  2 import java.util.Date;
  3 import java.util.ArrayList;
  4 import java.util.Scanner;
  5 import java.util.regex.Pattern;
  6 import java.util.regex.Matcher;
  7 import java.util.Collections;
  8 
  9 
 10 class User
 11 {
 12     UserRecords userRecords = new UserRecords();
 13     double balance = 100;
 14     ChargeMode chargeMode;
 15     String number;
 16     
 17     double calBalance()
 18     {
 19         return 100 - calCost();
 20     }
 21     
 22     double calCost()
 23     {
 24         LandlinePhoneCharging landlinePhoneCharging = new LandlinePhoneCharging();
 25         return landlinePhoneCharging.calCost(userRecords.sendMessageRecords);
 26     }
 27     
 28     UserRecords getUserRecords()
 29     {
 30         
 31         return userRecords;
 32     }
 33     
 34     void setUserRecords(UserRecords userRecords)
 35     {
 36         
 37     }
 38     
 39     double getBalance()
 40     {
 41         
 42         return 0;
 43     }
 44     
 45      ChargeMode getChargeMode()
 46      {
 47          
 48          return chargeMode;
 49      }
 50      
 51      void setChargeMode (ChargeMode chargeMode)
 52      {
 53          
 54      }
 55      
 56      String getNumber()
 57      {
 58          
 59          return number;
 60      }
 61      
 62      void setNumber (String number)
 63      {
 64          this.number = number;
 65      }
 66 }
 67 
 68 abstract class ChargeMode
 69 {
 70      ArrayList<ChargeRule>  chargeRules = new ArrayList<>();
 71     
 72      ArrayList<ChargeRule> getChargeRules()
 73      {
 74          return chargeRules;
 75      }
 76      
 77      void setChargeRules (ArrayList<ChargeRule> chargeRules)
 78      {
 79          this.chargeRules = chargeRules;
 80      }
 81      
 82        abstract double calCost (UserRecords userRecords);
 83 
 84      
 85      abstract double getMonthlyRent();
 86 }
 87 
 88 class LandlinePhoneCharging  //暂定这个是短信计费规则
 89 {
 90     double calCost(ArrayList<MessageRecord> messageRecords)
 91     {
 92         double i2 = 0, i4;
 93         double i1 = 0;
 94         for(int i3 = 0; i3 < messageRecords.size(); ++i3)
 95         {
 96             if(messageRecords.get(i3).message.length() > 10)
 97             {
 98                 for(i4 = messageRecords.get(i3).message.length(); i4 > 10; i4 = i4 - 10)
 99                 {
100                     ++i2;
101                 }
102             }
103         }
104         if((messageRecords.size() + i2) > 5)
105         {
106             i1 = (3*(messageRecords.size() + i2 - 5))/10 +7/10;
107         }
108         else if ((messageRecords.size() + i2) <= 3) 
109         {
110             i1 = (messageRecords.size() + i2)/10;
111         }
112         else 
113         {
114             i1 = (2*(messageRecords.size() + i2 - 3))/10 + 0.3;
115         }
116         return i1;
117     }
118 }
119 
120 class UserRecords
121 {
122     ArrayList<CallRecord> callinglnCityRecords = new ArrayList<CallRecord>();
123     ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<CallRecord>();
124     ArrayList<CallRecord> callinglnLandRecords = new ArrayList<CallRecord>();
125     ArrayList<CallRecord> answerlnCityRecords = new ArrayList<CallRecord>();
126     ArrayList<CallRecord> answerInProvinceRecords  = new ArrayList<CallRecord>();
127     ArrayList<CallRecord> answerlnLandRecords = new ArrayList<CallRecord>();
128     ArrayList<MessageRecord> sendMessageRecords =  new ArrayList<MessageRecord>();
129     ArrayList<MessageRecord> receiveMessageRecords =  new ArrayList<MessageRecord>();
130     
131     void addCallinglnCityRecords (CallRecord callRecord)
132     {
133         callinglnCityRecords.add(callRecord);
134     }
135     
136     void addCallingInProvinceRecords (CallRecord callRecord)
137     {
138         callinglnProvinceRecords.add(callRecord);
139     }
140     
141     void addCallinglnLandRecords (CallRecord callRecord)
142     {
143         callinglnLandRecords.add(callRecord);
144     }
145     
146     void addAnswerlnCityRecords (CallRecord answerRecord)
147     {
148         answerlnCityRecords.add(answerRecord);
149     }
150     
151     void addAnswerlnProvinceRecords (CallRecord answerRecord)
152     {
153         answerInProvinceRecords.add(answerRecord);
154     }
155     
156     void addAnswerlnLandRecords (CallRecord answerRecord)
157     {
158         answerlnLandRecords.add(answerRecord);
159     }
160     
161     void addSendMessageRecords (MessageRecord sendMessageRecord)
162     {
163         sendMessageRecords.add(sendMessageRecord);
164     }
165     
166     void addReceiveMessageRecords (MessageRecord receiveMessageRecord)
167     {
168         receiveMessageRecords.add(receiveMessageRecord);
169     }
170     
171      ArrayList<MessageRecord> getSendMessageRecords ()
172      {
173          return sendMessageRecords;
174      }
175      
176      ArrayList<MessageRecord> getReceiveMessageRecords ()
177      {
178          return receiveMessageRecords;
179      }
180      
181      ArrayList<CallRecord> getCallinglnCityRecords()
182      {
183          return callinglnCityRecords;
184      }
185      
186      ArrayList<CallRecord> getCallinglnProvinceRecords()
187      {
188          return callinglnProvinceRecords;
189      }
190      
191      ArrayList<CallRecord> getCallinglnLandRecords()
192      {
193          return  callinglnLandRecords;
194      }
195      
196      ArrayList<CallRecord> getAnswerlnCityRecords ()
197      {
198          return answerlnCityRecords;
199      }
200      
201      ArrayList<CallRecord> getAnswerlnProvinceRecords()
202      {
203          return answerInProvinceRecords;
204      }
205      
206      ArrayList<CallRecord> getAnswerInLandRecords()
207      {
208          return answerlnLandRecords;
209      }
210 }
211 
212 class CallRecord extends CommunicationRecord
213 {
214     Date startTime;
215     Date endTime;
216     String callingAddressAreaCode;
217     String answerAddressAreaCode;
218     
219     Date getStartTime()
220     {
221         return startTime;
222     }
223     
224     void setStartTime (Date startTime)
225     {
226         this.startTime = startTime;
227     }
228     
229     Date getEndTime()
230     {
231         return endTime;
232     }
233     
234     void setEndTime (Date endTime)
235     {
236         this.endTime = endTime;
237     }
238     
239     String getCallingAddressAreaCode()
240     {
241         return callingAddressAreaCode;
242     }
243     
244     void setCallingAddressAreaCode (String callingAddressAreaCode)
245     {
246         this.callingAddressAreaCode = callingAddressAreaCode;
247     }
248     
249     String getAnswerAddressAreaCode()
250     {
251         return answerAddressAreaCode;
252     }
253     
254     void setAnswerAddressAreaCode (String answerAddressAreaCode) 
255     {
256         this.answerAddressAreaCode = answerAddressAreaCode;
257     }
258 }
259 
260 class MessageRecord extends CommunicationRecord
261 {
262     String message;
263     
264     String getMessage()
265     {
266         return message;
267     }
268     
269     void setMessage (String message)
270     {
271         this.message = message;
272     }
273 }
274 
275 abstract class ChargeRule
276 {
277     
278 }
279 
280 abstract class CallChargeRule extends ChargeRule
281 {
282     abstract double  calCost (ArrayList<CallRecord> callRecords);
283 }
284 
285 abstract class CommunicationRecord
286 {
287     String callingNumber;
288     String answerNumber;
289     
290     String getCallingNumber()
291     {
292         return callingNumber;
293     }
294     
295     void setCallingNumber (String callingNumber)
296     {
297         this.callingNumber = callingNumber;
298     }
299     
300     String getAnswerNumber()
301     {
302         return answerNumber;
303     }
304     
305     void setAnswerNumber (String answeriNumber)
306     {
307         this.answerNumber = answeriNumber;
308     }
309 }
310 
311 
312 public class Main 
313 {
314     public static void main(String[] args) throws ParseException 
315     {
316         ArrayList<String> list = new ArrayList<String>();
317         ArrayList<String> list1 = new ArrayList<String>();
318         ArrayList<String> list2 = new ArrayList<String>();
319         ArrayList<String> list3 = new ArrayList<String>();
320         ArrayList<User> U = new ArrayList<User>();
321         String line = null;
322         Scanner sc = new Scanner(System.in);
323         //录入输入信息
324         while(!"end".equals(line = sc.nextLine())){
325             list.add(line);
326         }
327         sc.close();
328         //判断开户信息保并保存到存到list1容器中
329         for(int q1 = 0; q1 < list.size(); ++q1)
330         {
331             if(Pattern.matches("u-1[0-9]{10} [3]", list.get(q1)))
332             {
333                 list1.add(list.get(q1));
334             }
335         }
336         //手机号码排序
337         Collections.sort(list1);
338         //从list1容器中提取座机号码并保存到新建的user容器中
339         Pattern p1=Pattern.compile("1[0-9]{10}");
340         for(int q2 = 0; q2 < list1.size(); ++q2)
341         {
342             Matcher m1 = p1.matcher(list1.get(q2));
343             while(m1.find())
344             {
345                 User u = new User();
346                 u.number = m1.group(0);
347                 U.add(u);
348             }
349         }
350         //把大致正确的拨号信息存入到list2中去
351         String MobliePhoneNumber = "1[0-9]{10}";
352         String go = "[\\S|\\s]*";
353         for(int q3 = 0; q3 < list.size(); ++q3)
354         {
355             if(list.get(q3).matches("m-"+MobliePhoneNumber+" "+MobliePhoneNumber+" "+go))
356             {
357                 list2.add(list.get(q3));
358             }
359         }
360         //将list2中错误的信息格式剔除
361         for(int q4 = 0; q4 < list2.size(); ++q4)
362         {
363             String[] part = list2.get(q4).split(" ", 3);
364             for(int q5 = 0; q5 < part[2].length(); ++q5)
365             {
366                 if((int)part[2].charAt(q5) >= 48 && (int)part[2].charAt(q5) <= 57)
367                 {
368                     
369                 }
370                 else if((int)part[2].charAt(q5) >= 65 && (int)part[2].charAt(q5) <= 90)
371                 {
372                     
373                 }
374                 else if((int)part[2].charAt(q5) >= 97 && (int)part[2].charAt(q5) <= 122)
375                 {
376                     
377                 }
378                 else if((int)part[2].charAt(q5) == 32 || (int)part[2].charAt(q5) == 44 || (int)part[2].charAt(q5) == 46)
379                 {
380                     
381                 }
382                 else
383                 {
384                     list2.remove(q4);
385                 }
386             }
387         }
388         //将list2中的正确发送短息信息和User容器的号码匹配
389         String SendNum = null;
390         for(int q6 = 0; q6 < list2.size(); ++q6)
391         {
392             String[] part1 = list2.get(q6).split(" ", 3);
393             SendNum = part1[0].replace("m-", "");
394             for(int q7 = 0; q7 < U.size(); ++q7)
395             {
396                 if(U.get(q7).number.equals(SendNum))
397                 {
398                     MessageRecord messageRecord = new MessageRecord();
399                     messageRecord.callingNumber = SendNum;
400                     messageRecord.answerNumber = part1[1];
401                     messageRecord.message = part1[2];
402                     U.get(q7).userRecords.addSendMessageRecords(messageRecord);
403                 }
404             }
405         }
406         //输出结果
407         for(int q8 = 0; q8 < U.size(); ++q8)
408         {
409             System.out.println(U.get(q8).number + " " + U.get(q8).calCost() + " " + U.get(q8).calBalance());
410         }
411     }
412 }

 

 

这题虽是大作业最后一题,但是和前面几次的关联性就没有第一次和第二次那么强了。需要重新来设计架构来,不过架构简单了许多。只需注意短信发送的格式。而不用再刻意的管理座机了。在主函数中在录入完数据时候,要对发送短信的格式进行一个判断。我的思路是先进行一个大致的总体判断,没有可以去管理信息格式的判断。接着就专门提取信息数据利用阿斯克码值来判断数据是否是非法的。

对于此题的判断方式我写的有一些多余了,本可以一次判断格式,而我没有想到一个正则表达的写法,就拆成两次检查了。

给我启示就是正则表达式还需要再深入学习,以确保可以想匹配什么数据就匹配什么数据。

三.    踩坑心得

 在经历了短信计费系列作业后,我深刻意识到了自己正则表示上的不足,类结构设计的思想缺陷以及抽象类,接口的具体实现方法的不熟练。还需看慕课并且多加练习。

四.   改进意见

对题目集6   7-1题,题目集7    7-1,题目集8  7-1我的改进目标是编写代码是要严格按照类去定义其的属性和方法,让他们各司其职,并且又会有分工合作。

五.   总结

通过通讯计费作业,我又一次地认识到类的设计结构是多么的重要,如何合理的利用接口等一系列具体的方法。到后面的思考可以更加的符合面向对象语言的设计思路。

 

posted @ 2022-06-09 23:15  xxoooxx  阅读(200)  评论(0)    收藏  举报