OO第三次博客作业
OO第三次博客作业
前言:
1、知识点总结:
① 字符串操作,正则表达式的训练及应用。
② 类与对象的设计,继承与多态,接口,内部类,抽象类
2、题量:不多
3、难度分析:
题目集8:难在7-1 电信计费系列1-座机计费:①理解题目的意思②理解类间关系③正则表达式
题目集9:难在7-1 电信计费系列2-手机+座机计费混合拨打
题目集10:相比前两个题目集较为简单
源码设计与分析:
一、212016/71-题目集08——7-1 电信计费系列1-座机计费
1.题目(如下图)

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

5.踩坑心得
①![]()
具体操作:
可以用一个接口

复写的方法

主类操作:


②

具体操作:

5.改进建议:提取和储存用户通话记录的算法还有待改进
二、212016/71-题目集09——7-1 电信计费系列2-手机+座机计费
1.题目(如下图)

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

5.踩坑心得

6.改进建议:无
总结:
学会了什么:
1.通过对本阶段综合性总结,我对Java的基础语法(选择、函数、字符字符串相关操作、循环、方法、数组)有了更深层次的理解
2.对类与对象的设计原则有了更深层次的理解,了解了继承原则和多态特性,抽象类和接口,并能在实际编程加以应用
3.了解了什么是接口、抽象类,并能熟练应用
还需要改进加强的地方:
1.考虑问题不够全面
2.主函数不能做到完全解耦
3.算法不够精确不够简单

浙公网安备 33010602011771号