PTA-Blog-3
在经历一次多边形的洗礼后,又迎来了一大难题——电信计费,电话计费分为座机打座机,座机打手机,手机打座机,手机打手机,还有一个短信计费,里面一些要点,正则表达式的表达,calcost的计算,还有一些细节方面的问题,刚开始做座机计费时就没有提前几天做,然后又赶上快要线代考试了,更没什么心思去做了,当天截至当天才开始做。
可以从UserRecords类(通话记录)中获取各种类型的callRecords
在座机计费中,先要创建一个通话记录的类进行记录,如下
class UserRecord{ private ArrayList<CallRecord> callingInCityRecord=new ArrayList<>(); private ArrayList<CallRecord> callingInProvinceRecord=new ArrayList<>(); private ArrayList<CallRecord> callingInLandRecord=new ArrayList<>(); private ArrayList<CallRecord> answerInCityRecord=new ArrayList<>(); private ArrayList<CallRecord> answerInProvinceRecord=new ArrayList<>(); private ArrayList<CallRecord> answerInLandRecord=new ArrayList<>(); private ArrayList<MessageRecord> sendMessageRecords=new ArrayList<>(); private ArrayList<MessageRecord> receiveMessageRecords=new ArrayList<>();
在编写正则表达式时,有一个正则表达式在线测试的网站,觉得挺好用的,正则表达式几乎没怎么错过> https://c.runoob.com/front-end/854/ >,在里面会有些语法参考,这样即便不太记得怎么表达,也可以通过这个参考写出相应的正则表达式,界面如下,还是挺方便的
在手机+座机计费中的通话记录如下
private ArrayList<CallRecord> callinglnCityRecords = new ArrayList<>(); private ArrayList<CallRecord> callinglnProvinceRecords = new ArrayList<>(); private ArrayList<CallRecord> callinglnLandRecords = new ArrayList<>(); private ArrayList<CallRecord> MobileCityRecords = new ArrayList<>(); private ArrayList<CallRecord> MobileProvinceRecords = new ArrayList<>(); private ArrayList<CallRecord> MobileLandRecords = new ArrayList<>(); private ArrayList<CallRecord> callinglncityRecords = new ArrayList<>(); private ArrayList<CallRecord> callinglnRecords = new ArrayList<>(); private ArrayList<CallRecord> answerlnCityRecords = new ArrayList<>(); private ArrayList<CallRecord> answerlnProvinceRecords = new ArrayList<>(); private ArrayList<CallRecord> answerlnLandRecords = new ArrayList<>(); private ArrayList<MessageRecord> sendMessageRecords = new ArrayList<>(); private ArrayList<MessageRecord> receiveMessageRecords = new ArrayList<>();
每次都应考虑每个对象应该有哪些方法,每个对象之间有什么关系,在下列好多类图

在后续的代码编写中,类图会越来越复杂,需要创建的类,方法也会越来越多,初瞥一眼就已经领略到了他的和善,其实也没必要怎么慌张,一个一个来,写代码最忌粗心急躁,在第二次编写中参照第一次编写的类多加一些内容就好了,如果第一次没写好,那么第二次就要花费更多的时间来写了第二次的类与方法如下
`public ArrayList
return callinglnCityRecords;
}
public ArrayList<MessageRecord> getReceiveMessageRecords() {
return receiveMessageRecords;
}
public ArrayList<MessageRecord> getSendMessageRecords() {
return sendMessageRecords;
}
public ArrayList<CallRecord> getAnswerlnLandRecords() {
return answerlnLandRecords;
}
public ArrayList<CallRecord> getAnswerlnProvinceRecords() {
return answerlnProvinceRecords;
}
public ArrayList<CallRecord> getAnswerlnCityRecords() {
return answerlnCityRecords;
}
public ArrayList<CallRecord> getCallinglnLandRecords() {
return callinglnLandRecords;
}
public ArrayList<CallRecord> getCallinglnProvinceRecords() {
return callinglnProvinceRecords;
}
public ArrayList<CallRecord> getCallinglncityRecords() {
return callinglncityRecords;
}
public ArrayList<CallRecord> getCallinglnRecords() {
return callinglnRecords;
}
public ArrayList<CallRecord> getMobileLandRecords() {
return MobileLandRecords;
}
public ArrayList<CallRecord> getMobileProvinceRecords() {
return MobileProvinceRecords;
}
public ArrayList<CallRecord> getMobileCityRecords() {
return MobileCityRecords;
}
public void addMobileCityRecords(CallRecord callRecord){
MobileCityRecords.add(callRecord);
}
public void addMobileProvinceRecords(CallRecord callRecord){
MobileProvinceRecords.add(callRecord);
}
public void addMobileLandRecords(CallRecord callRecord){
MobileLandRecords.add(callRecord);
}
public void addcallinglnCityRecords(CallRecord callRecord){
callinglncityRecords.add(callRecord);
}
public void addcallinglnRecords(CallRecord callRecord){
callinglnRecords.add(callRecord);
}
public void addCallinglnCityRecords(CallRecord callRecord){
callinglnCityRecords.add(callRecord);
}
public void addCallinglnProvinceRecords(CallRecord callRecord){
callinglnProvinceRecords.add(callRecord);
}
public void addCallinglnLandRecords(CallRecord callRecord){
callinglnLandRecords.add(callRecord);
}
public void addAnswerlnCityRecords(CallRecord callRecord){
answerlnCityRecords.add(callRecord);
}
public void addAnswerlnProvinceRecords(CallRecord callRecord){
answerlnProvinceRecords.add(callRecord);
}
public void addAnswerlnLandRecords(CallRecord callRecord){
answerlnLandRecords.add(callRecord);
}
public void addSendMessageRecords(MessageRecord sendMessageRecord){
sendMessageRecords.add(sendMessageRecord);
}
public void addReceiveMessageRecords(MessageRecord receiveMessageRecord){
receiveMessageRecords.add(receiveMessageRecord);
}
}
abstract class CommunicationRecord {//通讯记录
protected String callingNumber ;
protected String answerNumber ;
public String getAnswerNumber() {
return answerNumber;
}
public void setAnswerNumber(String answerNumber) {
this.answerNumber = answerNumber;
}
public String getCallingNumber() {
return callingNumber;
}
public void setCallingNumber(String callingNumber) {
this.callingNumber = callingNumber;
}
}
class CallRecord extends CommunicationRecord{
private Date startTime ;//通话起始时间
private Date enfTime ;//结束时间
private String callingAddressAreaCode ;//拨号地点区号
private String answerAddressAreaCode ;//接听地点区号
public String getAnswerAddressAreaCode() {
return answerAddressAreaCode;
}
public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
this.answerAddressAreaCode = answerAddressAreaCode;
}
public String getCallingAddressAreaCode() {
return callingAddressAreaCode;
}
public void setCallingAddressAreaCode(String callingAddressAreaCode) {
this.callingAddressAreaCode = callingAddressAreaCode;
}
public Date getEnfTime() {
return enfTime;
}
public void setEnfTime(Date enfTime) {
this.enfTime = enfTime;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
}
class MessageRecord extends CommunicationRecord{//短信记录
private String message ;//短信息
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
abstract class CallChargeRule extends ChargeRule{
public double calCost(ArrayList
return 0;
}
}
abstract class ChargeRule{//计费记录
}
class CHARGE extends CallChargeRule{
public double calCost(UserRecords userRecord) {
double calCost=0;
for(int i=0;i<userRecord.getCallinglnCityRecords().size();i++){
long time=((userRecord.getCallinglnCityRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnCityRecords().get(i).getStartTime().getTime())/(100060));
if((userRecord.getCallinglnCityRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglncityRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.1;
}
for(int i=0;i<userRecord.getCallinglnProvinceRecords().size();i++){
long time=((userRecord.getCallinglnProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnProvinceRecords().get(i).getStartTime().getTime())/(100060));
if((userRecord.getCallinglnProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnProvinceRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.3;
}
for(int i=0;i<userRecord.getCallinglnLandRecords().size();i++) {
long time = ((userRecord.getCallinglnLandRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnLandRecords().get(i).getStartTime().getTime())/(100060));
if((userRecord.getCallinglnLandRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnLandRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.6;
}
for(int i=0;i<userRecord.getMobileCityRecords().size();i++){
calCost+=0.1Math.ceil((double)(userRecord.getMobileCityRecords().get(i).getEnfTime().getTime()-userRecord.getMobileCityRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileProvinceRecords().size();i++){
calCost+=0.2Math.ceil((double)(userRecord.getMobileProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getMobileProvinceRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileProvinceRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getMobileProvinceRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.6 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
return calCost;
}
abstract class MessageChargeRule extends ChargeRule{
public double calCost (ArrayList
return 0;
}
}
class SendMessageRule extends MessageChargeRule{
@Override
public double calCost(ArrayList
return super.calCost(messageRecords);
}
}} 在计费过程中最重要的时计算了,其中弯弯绕绕的,最重要的是命名了,命名如果不是自己了解清楚来命名的,在引用时就会很不方便,幸好eclipse中有一个写出部分代码就能引出全部内容,也是为了让写代码的人有更好的编写体验class CHARGE extends CallChargeRule{
public double calCost(UserRecords userRecord) {
double calCost=0;
for(int i=0;i<userRecord.getCallinglnCityRecords().size();i++){
long time=((userRecord.getCallinglnCityRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnCityRecords().get(i).getStartTime().getTime())/(1000
if((userRecord.getCallinglnCityRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglncityRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.1;
}
for(int i=0;i<userRecord.getCallinglnProvinceRecords().size();i++){
long time=((userRecord.getCallinglnProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnProvinceRecords().get(i).getStartTime().getTime())/(100060));
if((userRecord.getCallinglnProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnProvinceRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.3;
}
for(int i=0;i<userRecord.getCallinglnLandRecords().size();i++) {
long time = ((userRecord.getCallinglnLandRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnLandRecords().get(i).getStartTime().getTime())/(100060));
if((userRecord.getCallinglnLandRecords().get(i).getEnfTime().getTime()-userRecord.getCallinglnLandRecords().get(i).getStartTime().getTime())%(100060)!=0)
time++;
calCost+=time0.6;
}
for(int i=0;i<userRecord.getMobileCityRecords().size();i++){
calCost+=0.1Math.ceil((double)(userRecord.getMobileCityRecords().get(i).getEnfTime().getTime()-userRecord.getMobileCityRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileProvinceRecords().size();i++){
calCost+=0.2Math.ceil((double)(userRecord.getMobileProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getMobileProvinceRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileProvinceRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileProvinceRecords().get(i).getEnfTime().getTime()-userRecord.getMobileProvinceRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.6 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
for(int i=0;i<userRecord.getMobileLandRecords().size();i++) {
calCost += 0.3 * Math.ceil((double) (userRecord.getMobileLandRecords().get(i).getEnfTime().getTime()-userRecord.getMobileLandRecords().get(i).getStartTime().getTime())/(100060));
}
return calCost;
} 在上面的代码中,例如userRecord.getMobileProvinceRecords()``userRecord.getMobileProvinceRecords()`这种,就是省内电话拨打省内电话的例子,如果在写的时候没有分清,在后期查找错误的时候也不报错,因为写的错误的方法也是里面存在的并不是凭空出现写错的。
短信计费也是引用了之前的电话+座机计费,多了另外的短信计费,在写的过程中好似不太需要关心之前的计费是否出现问题,直接写短信计费就可以,也是难得的搞了一次满分。
总结:
总之这次最多的体会还是感叹类图之复杂,java之深奥,命名之艰难,不多花时间在上面在一天内想要彻底搞懂这个问题到底在问什么还是有些困难的,还一个是字符匹配,可以通过match也可以通过正则表达式来匹配,匹配的时候还是正则表达式更具普遍性。在这次作业前也没想到一个简单的数学题目,编写起来是这么困难,市内,省内,省外漫游苦不堪言,下次写作业的时候还是应该提前些时间,多些时间思考,才能写出更好的代码。
浙公网安备 33010602011771号