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我的改进目标是编写代码是要严格按照类去定义其的属性和方法,让他们各司其职,并且又会有分工合作。
五. 总结
通过通讯计费作业,我又一次地认识到类的设计结构是多么的重要,如何合理的利用接口等一系列具体的方法。到后面的思考可以更加的符合面向对象语言的设计思路。

浙公网安备 33010602011771号