最后三次大作业总结

(1)前言: 本次博客主要分析的内容有:后三次。对我而言,最后一次大作业是这三次中最简单的 因为我差一点就能满分了(杀天的测试点死活过不去)。这三次大作业都设计了新的题型 电信计费系列 从最初的座机情况到电话再到短信情况,总体而言难度是递增的。

(2)设计与分析:

1.1:

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Scanner;

import java.util.HashSet;

import java.util.Date;

import java.util.ArrayList;

public class Main {

       public static void main(String[] args) throws ParseException {

              DecimalFormat df = new DecimalFormat("0.00");

              SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

              Scanner in = new Scanner(System.in);

              String ps="";

              String callnumber;

              String answernumber;

              String time1;//开始日子

              String time2;//开始时间

              String time3;//结束日子

              String time4;//结束时间

              //int case1=-1;

              Date s=new Date();

              Date e=new Date();

              HashSet<User> use=new HashSet<User>();

              User user;

              CallRecord callrecord;

              while(!ps.equals("end")) {

                     ps=in.next();

              if(ps.charAt(0)=='u'&&(ps.length()==14||ps.length()==13)) {

                            user=new User();

                            user.setnumber(ps.substring(2));

                            //case1=in.nextInt();

                            use.add(user);

                     }

              if(ps.charAt(0)=='t'&&(ps.length()==14||ps.length()==13)) {

                            callnumber=ps.substring(2);

                            answernumber=in.next();

                     if(answernumber.length()==12||answernumber.length()==11){

                            time1=in.next();

                            time2=in.next();

                            time3=in.next();

                            time4=in.next();

                            if(isValid(time1+" "+time2)&&isValid(time3+" "+time4)) {

                            s = format.parse(time1+" "+time2);

                   e = format.parse(time3+" "+time4);

                   for(User u:use) {

                                   if(u.getnumber().equals(callnumber)) {

                                          callrecord=new CallRecord();

                                          callrecord.setstart(s);

                                          callrecord.setend(e);

                                          callrecord.setcallnumber(callnumber);

                                          callrecord.setanswernumber(answernumber);

                                          callrecord.setcall(callnumber.substring(0, 4));

                                          callrecord.setanswer(answernumber.substring(0, 4));

                                          if(callrecord.getanswer().equals("0791")) {

                                                 u.user.addcallcity(callrecord);

                                          }

                                          else if(callrecord.getanswer().equals("0701")||(callrecord.getanswer().substring(0, 3).equals("079")&&callrecord.getanswer().charAt(3)<='9'&&callrecord.getanswer().charAt(3)>='0')) {

                                                 u.user.addcallland(callrecord);

                                          }

                                          else {

                                                 u.user.addcallp(callrecord);

                                          }

                                   }

                            }

                            }

                }

                     }

              }

              in.close();

              User use1[]=new User [use.size()];

              int i=0;

              for(User u:use) {

                     use1[i]=u;

                     i++;

              }

              User t;

              for(i=0;i<use1.length;i++) {

                     for(int k=0;k<use1.length-1;k++) {

                          if(isBiggerThan(use1[k].number,use1[k+1].number)) {

                                   t=use1[k];

                                   use1[k]=use1[k+1];

                                   use1[k+1]=t;

                            }

                     }

              }

              for(User u:use1) {

                     System.out.println(u.getnumber()+" "+Double.valueOf(df.format(u.calcost()))+" "+Double.valueOf(df.format(u.calbalance())));

              }

       }

      

       private static boolean isBiggerThan(String first, String second){

        if(first==null||second==null||"".equals(first) || "".equals(second)){

             return false;

        }       

        char[] arrayfirst=first.toCharArray();

        char[] arraysecond=second.toCharArray();       

        int minSize = Math.min(arrayfirst.length, arraysecond.length);       

        for (int i=0;i<minSize;i++) {

            if((int)arrayfirst[i]>(int)arraysecond[i]){

                return true;

            }else if((int)arrayfirst[i] < (int)arraysecond[i]){

                return false;

            }

        }

        if(arrayfirst.length>arraysecond.length){

            return true;

        }else {

            return false;

        }

    }

       private static boolean isValid(String string) {

              return true;

       }

}

 

 class CallRecord extends CommunicationRecord{

       Date startTime;

       Date endTime;

       String calladdressareacode;

       String answeraddress;

       double cost;

       long diff;

    long diffSeconds ;

    long diffHours ;

    long diffMinutes ;

       public Date getstart() {

              return this.startTime;

       }

       public void setstart(Date start) {

              this.startTime=start;

       }

       public Date getend() {

              return this.endTime;

       }

       public void setend(Date end) {

              this.endTime=end;

       }

       public String getcall() {

              return this.calladdressareacode;

       }

       public void setcall(String call) {

              this.calladdressareacode=call;

       }

       public String getanswer() {

              return this.answeraddress;

       }

       public void setanswer(String answer) {

              this.answeraddress=answer;

       }

       public double cal() {

              long diff = endTime.getTime() - startTime.getTime();

           long diffSeconds = diff / 1000 % 60;

           long diffHours = diff / (60 * 60 * 1000) % 24;

           long diffMinutes = diff / (60 * 1000) % 60;

           int mi;

           mi=(int)(diffHours*60+diffMinutes);

           if(diffSeconds!=0) {

                  mi+=1;

           }

           if(this.getanswer().equals("0791")) {

                     this.cost=mi*0.1;

              }

              else if(this.getanswer().equals("0701")||(this.getanswer().substring(0, 3).equals("079")&&this.getanswer().charAt(3)<='9'&&this.getanswer().charAt(3)>='0')) {

                     this.cost=mi*0.3;

              }

              else {

                     this.cost=mi*0.6;

              }

           return this.cost;

       }

}

abstract class CommunicationRecord {

       String callnumber;

       String answernumber;

       public String getcallnumber() {

              return callnumber;

       }

       public void setcallnumber(String call) {

              this.callnumber=call;

       }

       public String getanswernumber() {

              return answernumber;

       }

       public void setanswernumber(String answer) {

              this.answernumber=answer;

       }

 

}

class User {

       double cost=0;

       double balance=80;

       String number;

       int case1;

       UserRecords user=new UserRecords();

       public void setcase1(int c) {

              case1=c;

       }

       public int getcase1() {

              return case1;

       }

       public double calbalance() {

              balance=balance-this.cost;

              return balance;

       }

       public double calcost() {

              user.calcost();

              this.cost=user.cost;

              return this.cost;

       }

       public double getbalance() {

              return balance;

       }

       public String getnumber() {

              return number;

       }

       public void setnumber(String number) {

              this.number=number;

       }

}

 

 class UserRecords {

       double cost=0;

       HashSet<CallRecord> callincity=new HashSet<CallRecord>();

       HashSet<CallRecord> callinprovince=new HashSet<CallRecord>();

       HashSet<CallRecord> callinland=new HashSet<CallRecord>();

       HashSet<CallRecord> answerincity=new HashSet<CallRecord>();

       HashSet<CallRecord> answerinprovince=new HashSet<CallRecord>();

       HashSet<CallRecord> answerinland=new HashSet<CallRecord>();

       public void calcost() {

              for(CallRecord call:callincity) {

                     cost+=call.cal();

              }

              for(CallRecord call:callinprovince) {

                     cost+=call.cal();

              }

              for(CallRecord call:callinland) {

                     cost+=call.cal();

              }

       }

       public void addcallcity(CallRecord call) {

              callincity.add(call);

       }

       public void addcallp(CallRecord call) {

              callinprovince.add(call);

       }

       public void addcallland(CallRecord call) {

              callinland.add(call);

       }

       public void addanswercity(CallRecord call) {

              answerincity.add(call);

       }

       public void addanswercallp(CallRecord call) {

              answerincity.add(call);

       }

       public void addanswercallland(CallRecord call) {

              answerincity.add(call);

       }

      

}

类设计:

1. CommunicationRecord类:

负责保存打来的电话与接听的电话。

2. CallRecord类:

继承与1,负责保存打电话的时间与结束通话的时间,并计算总共消耗了多少时间。

3. User类:

负责储存用户余额 用户的电话号码 以及用户的套餐

4. UserRecords类:

负责记录不同的通话记录

2.1:

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.text.ParsePosition;

import java.time.LocalDateTime;

import java.time.ZoneId;

import java.time.temporal.ChronoUnit;

import java.util.Scanner;

import java.util.Date;

import java.text.DateFormat;

import java.util.ArrayList;

public class Main {

       static ArrayList<User> use=new ArrayList<User>();

       static Scanner in = new Scanner(System.in);

       static DecimalFormat df = new DecimalFormat("0.00");

       public static void main(String[] args) throws ParseException {

              String ps="";

              String callnumber;

              String number="";

              int case1;

              User user;

              int count=0;

              while(!ps.equals("end")) {

                     boolean nocoin=true;//判断有无重复号码

                     ps=in.next();

                     if(ps.length()>=2)

                     number=ps.substring(2);

                     if(count!=0) {

                     for(User u:use) {

                            if(u.getnumber().equals(number)) {

                                   nocoin=false;

                                   break;

                            }

                     }

                     }

              if(ps.charAt(0)=='u'&&(ps.length()==14||ps.length()==13)&&nocoin) {

                                   user=new User();

                                   user.setnumber(ps.substring(2));

                                   case1=in.nextInt();

                                   user.setcase1(case1);

                                   use.add(user);

                                   count++;

                            }

                     if(ps.charAt(0)=='t'&&(ps.length()==14||ps.length()==13)) {

                                   callnumber=ps.substring(2);

                                   if(callnumber.charAt(0)=='0')//座机拨打

                                          phone1(callnumber);

                                   if(callnumber.charAt(0)=='1')//手机拨打

                                          phone2(callnumber);

                            }

                    

              }

              in.close();

              User use1[]=new User [use.size()];

              int i=0;

              for(User u:use) {//arrlist转数组

                     use1[i]=u;

                     i++;

              }

              User t;

              for(i=0;i<use1.length;i++) {//数组排序

                     for(int k=0;k<use1.length-1;k++) {

                          if(isBiggerThan(use1[k].number,use1[k+1].number)) {

                                   t=use1[k];

                                   use1[k]=use1[k+1];

                                   use1[k+1]=t;

                            }

                     }

              }

              for(User u:use1) {

                     System.out.println(u.getnumber()+" "+Double.valueOf(df.format(u.calcost()))+" "+Double.valueOf(df.format(u.calbalance())));

              }

       }

       private static void phone1(String callnumber) throws ParseException {//座机打

              SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

              String answernumber;

              String time1;//开始日子

              String time2;//开始时间

              String time3;//结束日子

              String time4;//结束时间

              String area="";

              Date s=new Date();

              Date e=new Date();

              answernumber=in.next();

              CallRecord callrecord;

              if(answernumber.charAt(0)=='1') //手机接听 记录区号

              area=in.next();

       if(answernumber.length()==12||answernumber.length()==11||answernumber.length()==10){

              time1=in.next();

              time2=in.next();

              time3=in.next();

              time4=in.next();

              if(isDate(time1+" "+time2,"yyyy.MM.dd HH:mm:ss")&&isDate(time3+" "+time4,"yyyy.MM.dd HH:mm:ss")) {

              s = format.parse(time1+" "+time2);

        e = format.parse(time3+" "+time4);

       

        for(User u:use) {

                     if(u.getnumber().equals(callnumber)) {

                            callrecord=new CallRecord();

                            callrecord.setstart(s);

                            callrecord.setend(e);

                            callrecord.setcallnumber(callnumber);

                            callrecord.setanswernumber(answernumber);

                            callrecord.setcall(callnumber.substring(0, 4));

                            if(area.equals("")) {

                            callrecord.setanswer(answernumber.substring(0, 4));

                            }

                            else {

                            callrecord.setanswer(area);

                            }

                            if(callrecord.getanswer().equals("0791")) {

                                   u.user.addcallcity(callrecord);

                            }

                            else if(callrecord.getanswer().equals("0701")||(callrecord.getanswer().substring(0,callrecord.getanswer().length()-1).equals("079")&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)<='9'&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)>='0')) {

                                   u.user.addcallp(callrecord);

                            }

                            else {

                                   u.user.addcallland(callrecord);

                            }

                     }

              }

              }

        }

             

              for(User u:use) {//再次遍历 查看有无手机省外漫游接听

              if(u.getnumber().equals(answernumber)&&answernumber.charAt(0)=='1') {

                            callrecord=new CallRecord();

                            callrecord.setstart(s);

                            callrecord.setend(e);

                            callrecord.setcallnumber(callnumber);

                            callrecord.setanswernumber(answernumber);

                            callrecord.setcall(callnumber.substring(0,4));

                            callrecord.setanswer(area);

                            if(callrecord.getanswer().equals("0791")) {

                                  

                            }

                            else if(callrecord.getanswer().equals("0701")||(callrecord.getanswer().substring(0,callrecord.getanswer().length()-1).equals("079")&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)<='9'&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)>='0')) {

                                  

                            }

                            else {

                                   u.user.addanswercallland(callrecord);

                            }

                     }

              }

             

       }

       private static void phone2(String callnumber) throws ParseException {//手机打

              SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

              String answernumber;

              String time1;//开始日子

              String time2;//开始时间

              String time3;//结束日子

              String time4;//结束时间

              String area1="";//手机拨出去的区号

              String area2="";//接电话的区号 座机无

              Date s=new Date();

              Date e=new Date();

              area1=in.next();

              answernumber=in.next();

              CallRecord callrecord;

              if(answernumber.charAt(0)=='1') //手机接听 记录区号

                     area2=in.next();

              if(answernumber.length()==12||answernumber.length()==11||answernumber.length()==10){

                     time1=in.next();

                     time2=in.next();

                     time3=in.next();

                     time4=in.next();

                      if(isDate(time1+" "+time2,"yyyy.MM.dd HH:mm:ss")&&isDate(time3+" "+time4,"yyyy.MM.dd HH:mm:ss")) {

                     s = format.parse(time1+" "+time2);

               e = format.parse(time3+" "+time4);

             

               for(User u:use) {

                            if(u.getnumber().equals(callnumber)) {

                                   callrecord=new CallRecord();

                                   callrecord.setstart(s);

                                   callrecord.setend(e);

                                   callrecord.setcallnumber(callnumber);

                                   callrecord.setanswernumber(answernumber);

                                   callrecord.setcall(area1);

                                   if(area2.equals("")) {

                                   callrecord.setanswer(answernumber.substring(0, 4));

                                   }

                                   else {

                                   callrecord.setanswer(area2);

                                   }

                                   if(callrecord.getcall().equals("0791")) {//记录市内打各种电话

                                          if(callrecord.getanswer().equals("0791")) {

                                                 u.user.addcallcity1(callrecord);

                                          }

                                          else if(callrecord.getanswer().equals("0701")||(callrecord.getanswer().substring(0,callrecord.getanswer().length()-1).equals("079")&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)<='9'&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)>='0')) {

                                                 u.user.addcallp1(callrecord);

                                          }

                                          else {

                                                 u.user.addcallland1(callrecord);

                                          }

                                   }

                                   else if(callrecord.getcall().equals("0701")||(callrecord.getcall().substring(0,callrecord.getcall().length()-1).equals("079")&&callrecord.getcall().charAt(callrecord.getcall().length()-1)<='9'&&callrecord.getcall().charAt(callrecord.getcall().length()-1)>='0')){//记录省内漫游

                                          u.user.addinlandcallout(callrecord);

                                   }

                                   else {//记录省外漫游

                                          u.user.addoutlandcallout(callrecord);

                                   }

                            }

                     }

               }

               for(User u:use) {//再次遍历 查看有无手机省外漫游接听

                     if(u.getnumber().equals(answernumber)&&answernumber.charAt(0)=='1') {

                                   callrecord=new CallRecord();

                                   callrecord.setstart(s);

                                   callrecord.setend(e);

                                   callrecord.setcallnumber(callnumber);

                                   callrecord.setanswernumber(answernumber);

                                   callrecord.setcall(callnumber.substring(0,4));

                                   callrecord.setanswer(area2);

                                   if(callrecord.getanswer().equals("0791")) {

                                         

                                   }

                                   else if(callrecord.getanswer().equals("0701")||(callrecord.getanswer().substring(0,callrecord.getanswer().length()-1).equals("079")&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)<='9'&&callrecord.getanswer().charAt(callrecord.getanswer().length()-1)>='0')) {

                                         

                                   }

                                   else {

                                          u.user.addanswercallland(callrecord);

                                   }

                            }

                     }

               }

       }

       private static boolean isDate(String dttm, String format) {

 

              if (dttm == null || dttm.isEmpty() || format == null || format.isEmpty()) {

 

              return false;

 

              }

 

              if (format.replaceAll("'.+?'", "").indexOf("y") < 0) {

 

              format += "/yyyy";

 

              DateFormat formatter = new SimpleDateFormat("/yyyy");

 

              dttm += formatter.format(new Date());

 

              }

 

              DateFormat formatter = new SimpleDateFormat(format);

 

              formatter.setLenient(false);

 

              ParsePosition pos = new ParsePosition(0);

 

              Date date = formatter.parse(dttm, pos);

 

              if (date == null || pos.getErrorIndex() > 0) {

 

              return false;

 

              }

 

              if (pos.getIndex() != dttm.length()) {

 

              return false;

 

              }

 

              if (formatter.getCalendar().get(Calendar.YEAR) > 9999) {

 

              return false;

 

              }

 

              return true;

 

              }

       private static boolean isBiggerThan(String first, String second){

        if(first==null||second==null||"".equals(first) || "".equals(second)){

             return false;

        }       

        char[] arrayfirst=first.toCharArray();

        char[] arraysecond=second.toCharArray();       

        int minSize = Math.min(arrayfirst.length, arraysecond.length);       

        for (int i=0;i<minSize;i++) {

            if((int)arrayfirst[i]>(int)arraysecond[i]){

                return true;

            }else if((int)arrayfirst[i] < (int)arraysecond[i]){

                return false;

            }

        }

        if(arrayfirst.length>arraysecond.length){

            return true;

        }else {

            return false;

        }

    }

}

 

class User {

       double cost=0;

       double balance;

       String number;

       int case1;

       UserRecords user=new UserRecords();

       public void setcase1(int c) {

              case1=c;

              if(case1==0) {

                     this.balance=80;

              }

              else {

                     this.balance=85;

              }

       }

       public int getcase1() {

              return case1;

       }

       public double calbalance() {

              balance=balance-this.cost;

              return balance;

       }

       public double calcost() throws ParseException  {

              user.calcost();

              this.cost=user.cost;

              return this.cost;

       }

       public double getbalance() {

              return balance;

       }

       public String getnumber() {

              return number;

       }

       public void setnumber(String number) {

              this.number=number;

       }

}

class UserRecords {

       double cost=0;

       ArrayList<CallRecord> callincity=new ArrayList<CallRecord>();//座机市内打市内

       ArrayList<CallRecord> callinprovince=new ArrayList<CallRecord>();//座机市内打省内

       ArrayList<CallRecord> callinland=new ArrayList<CallRecord>();//座机市内打国内

       ArrayList<CallRecord> callincity1=new ArrayList<CallRecord>();//手机市内打市内

       ArrayList<CallRecord> callinprovince1=new ArrayList<CallRecord>();//手机市内打省内

       ArrayList<CallRecord> callinland1=new ArrayList<CallRecord>();//手机市内打国内

       ArrayList<CallRecord> inlandcallout=new ArrayList<CallRecord>();//手机省内漫游拨打

       ArrayList<CallRecord> outlandcallout=new ArrayList<CallRecord>();//手机省外漫游拨打

       ArrayList<CallRecord> answerinland=new ArrayList<CallRecord>();//手机省外接听漫游

       public void calcost() throws ParseException  {

              for(CallRecord call:callincity) {

                     cost+=call.cal()*0.1;

              }

              for(CallRecord call:callinprovince) {

                     cost+=call.cal()*0.3;

              }

              for(CallRecord call:callinland) {

                     cost+=call.cal()*0.6;

              }

              for(CallRecord call:callincity1) {

                     cost+=call.cal()*0.1;

              }

              for(CallRecord call:callinprovince1) {

                     cost+=call.cal()*0.2;

              }

              for(CallRecord call:callinland1) {

                     cost+=call.cal()*0.3;

              }

              for(CallRecord call:inlandcallout) {

                     cost+=call.cal()*0.3;

              }

              for(CallRecord call:outlandcallout) {

                     cost+=call.cal()*0.6;

              }

              for(CallRecord call:answerinland) {

                     cost+=call.cal()*0.3;

              }

       }

       public void addcallcity(CallRecord call) {

              callincity.add(call);

       }

       public void addcallp(CallRecord call) {

              callinprovince.add(call);

       }

       public void addcallland(CallRecord call) {

              callinland.add(call);

       }

       public void addcallcity1(CallRecord call) {

              callincity1.add(call);

       }

       public void addcallp1(CallRecord call) {

              callinprovince1.add(call);

       }

       public void addcallland1(CallRecord call) {

              callinland1.add(call);

       }

       public void addinlandcallout(CallRecord call) {

              inlandcallout.add(call);

       }

       public void addoutlandcallout(CallRecord call) {

              outlandcallout.add(call);

       }

       public void addanswercallland(CallRecord call) {

              answerinland.add(call);

       }

      

}

abstract class CommunicationRecord {

       String callnumber;

       String answernumber;

       public String getcallnumber() {

              return callnumber;

       }

       public void setcallnumber(String call) {

              this.callnumber=call;

       }

       public String getanswernumber() {

              return answernumber;

       }

       public void setanswernumber(String answer) {

              this.answernumber=answer;

       }

 

}

class CallRecord extends CommunicationRecord{

       Date startTime;

       Date endTime;

       String calladdressareacode;

       String answeraddress;

       double cost;

       long diff;

    long diffSeconds ;

    long diffHours ;

    long diffMinutes ;

       public Date getstart() {

              return this.startTime;

       }

       public void setstart(Date start) {

              this.startTime=start;

       }

       public Date getend() {

              return this.endTime;

       }

       public void setend(Date end) {

              this.endTime=end;

       }

       public String getcall() {

              return this.calladdressareacode;

       }

       public void setcall(String call) {

              this.calladdressareacode=call;

       }

       public String getanswer() {

              return this.answeraddress;

       }

       public void setanswer(String answer) {

              this.answeraddress=answer;

       }

       public int cal() throws ParseException   {

              long diff = endTime.getTime() - startTime.getTime();

           long diffSeconds = diff / 1000 % 60;

           long diffHours = diff / (60 * 60 * 1000) % 24;

           long diffMinutes = diff / (60 * 1000) % 60;

           int day;

           int mi;

           mi=(int)(diffHours*60+diffMinutes);

           if(diffSeconds!=0) {

                  mi+=1;

           }

          return this.calculateTimeDifference(startTime, endTime);

       }

       public static int calculateTimeDifference(Date startDate, Date endDate) {

           if (null == startDate || null == endDate) {

               return 0;

           }

           ZoneId zoneId = ZoneId.systemDefault();

           LocalDateTime fromDateTime = LocalDateTime.ofInstant(startDate.toInstant(), zoneId);

           LocalDateTime toDateTime = LocalDateTime.ofInstant(endDate.toInstant(), zoneId);

 

           LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);

 

           long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);

 

           long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);

 

           long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);

 

           long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);

 

           long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);

 

           long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);

           if(seconds!=0)

                  minutes++;

           return (int)minutes;

 

       }

 

}

3.1:

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.text.ParsePosition;

import java.time.LocalDateTime;

import java.time.ZoneId;

import java.time.temporal.ChronoUnit;

import java.util.Scanner;

import java.util.Date;

import java.text.DateFormat;

import java.util.ArrayList;

public class Main {

       static ArrayList<User> use=new ArrayList<User>();

       static Scanner in = new Scanner(System.in);

       static DecimalFormat df = new DecimalFormat("0.00");

       public static void main(String[] args) throws ParseException {

              String ps="";

              String callnumber;

              String answernumber;

              String message;

              String number="";

              boolean go=true;

              String case1;

              User user;

              int count=0;

              CallRecord callrecord;

              while(!ps.equals("end")) {

                     boolean nocoin=true;//判断有无重复号码

                     ps=in.next();

                     if(ps.length()>=2)

                     number=ps.substring(2);

                     if(count!=0) {

                     for(User u:use) {

                            if(u.getnumber().equals(number)) {

                                   nocoin=false;

                                   break;

                            }

                     }

                     }

                     if(ps.matches("u-1\\d{10}")&&nocoin) {

                                   user=new User();

                                   user.setnumber(ps.substring(2));

                                   case1=in.next();

                                   String oo;

                                   oo=ps+" "+case1;

                                   if(oo.matches("u-1\\d{10} 3")) {

                                   user.setcase1(case1);

                                   use.add(user);

                                   count++;

                                   }

                            }

                            if(ps.matches("m-1\\d{10}")) {

                                   callnumber=ps.substring(2);

                                   answernumber=in.next();

                                   message=in.nextLine();

                                   String oo;

                                   oo=ps+" "+answernumber+message;

                                   if(oo.matches("m-1[0-9]{10}\\ 1[0-9]{10}\\ ([0-9]|[a-z]|[A-Z]|\\ |,|\\.)+")) {

                                   for(User u:use) {

                                          if(u.getnumber().equals(callnumber)) {

                                                 callrecord=new CallRecord();

                                                 callrecord.setcallnumber(callnumber);

                                                 callrecord.setanswernumber(answernumber);

                                                 callrecord.setmessage(message.substring(1));

                                                 u.user.addmessage(callrecord);

                                          }

                                   }

                            }

                            }

                    

              }

              in.close();

              User use1[]=new User [use.size()];

              int i=0;

              for(User u:use) {//arrlist转数组

                     use1[i]=u;

                     i++;

              }

              User t;

              for(i=0;i<use1.length;i++) {//数组排序

                     for(int k=0;k<use1.length-1;k++) {

                          if(isBiggerThan(use1[k].number,use1[k+1].number)) {

                                   t=use1[k];

                                   use1[k]=use1[k+1];

                                   use1[k+1]=t;

                            }

                     }

              }

              for(User u:use1) {

                     System.out.println(u.getnumber()+" "+Double.valueOf(df.format(u.calcost()))+" "+Double.valueOf(df.format(u.calbalance())));

              }

       }

       private static boolean isBiggerThan(String first, String second){

        if(first==null||second==null||"".equals(first) || "".equals(second)){

             return false;

        }       

        char[] arrayfirst=first.toCharArray();

        char[] arraysecond=second.toCharArray();       

        int minSize = Math.min(arrayfirst.length, arraysecond.length);       

        for (int i=0;i<minSize;i++) {

            if((int)arrayfirst[i]>(int)arraysecond[i]){

                return true;

            }else if((int)arrayfirst[i] < (int)arraysecond[i]){

                return false;

            }

        }

        if(arrayfirst.length>arraysecond.length){

            return true;

        }else {

            return false;

        }

    }

}

class User {

       double cost=0;

       double balance;

       String number;

       String case1;

       UserRecords user=new UserRecords();

       public void setcase1(String c) {

              case1=c;

              if(case1.equals("3")) {

                     this.balance=100;

              }

              else {

                     this.balance=85;

              }

       }

       public String getcase1() {

              return case1;

       }

       public double calbalance() {

              balance=balance-this.cost;

              return balance;

       }

       public double calcost() throws ParseException  {

              user.calcost();

              this.cost=user.cost;

              return this.cost;

       }

       public double getbalance() {

              return balance;

       }

       public String getnumber() {

              return number;

       }

       public void setnumber(String number) {

              this.number=number;

       }

}

class UserRecords {

       double cost=0;

       ArrayList<CallRecord> callincity=new ArrayList<CallRecord>();//座机市内打市内

       ArrayList<CallRecord> callinprovince=new ArrayList<CallRecord>();//座机市内打省内

       ArrayList<CallRecord> callinland=new ArrayList<CallRecord>();//座机市内打国内

       ArrayList<CallRecord> callincity1=new ArrayList<CallRecord>();//手机市内打市内

       ArrayList<CallRecord> callinprovince1=new ArrayList<CallRecord>();//手机市内打省内

       ArrayList<CallRecord> callinland1=new ArrayList<CallRecord>();//手机市内打国内

       ArrayList<CallRecord> inlandcallout=new ArrayList<CallRecord>();//手机省内漫游拨打

       ArrayList<CallRecord> outlandcallout=new ArrayList<CallRecord>();//手机省外漫游拨打

       ArrayList<CallRecord> answerinland=new ArrayList<CallRecord>();//手机省外接听漫游

       ArrayList<CallRecord> message=new ArrayList<CallRecord>();//记录短信

       public void calcost()   {

              int length=0;

              for(CallRecord call:message) {

                     length+=call.cal();

              }

              if(length>5) {

                     cost+=0.7;

                     cost+=(length-5)*0.3;

              }

              else if(length>3) {

                     cost+=0.3;

                     cost+=(length-3)*0.2;

              }

              else {

                     cost+=length*0.1;

              }

       }

       public void addcallcity(CallRecord call) {

              callincity.add(call);

       }

       public void addcallp(CallRecord call) {

              callinprovince.add(call);

       }

       public void addcallland(CallRecord call) {

              callinland.add(call);

       }

       public void addcallcity1(CallRecord call) {

              callincity1.add(call);

       }

       public void addcallp1(CallRecord call) {

              callinprovince1.add(call);

       }

       public void addcallland1(CallRecord call) {

              callinland1.add(call);

       }

       public void addinlandcallout(CallRecord call) {

              inlandcallout.add(call);

       }

       public void addoutlandcallout(CallRecord call) {

              outlandcallout.add(call);

       }

       public void addanswercallland(CallRecord call) {

              answerinland.add(call);

       }

       public void addmessage(CallRecord call) {

              message.add(call);

       }

      

}

abstract class CommunicationRecord {

       String callnumber;

       String answernumber;

       public String getcallnumber() {

              return callnumber;

       }

       public void setcallnumber(String call) {

              this.callnumber=call;

       }

       public String getanswernumber() {

              return answernumber;

       }

       public void setanswernumber(String answer) {

              this.answernumber=answer;

       }

 

}

class CallRecord extends CommunicationRecord{

       Date startTime;

       Date endTime;

       String calladdressareacode;

       String answeraddress;

       String message;

       double cost;

       long diff;

    long diffSeconds ;

    long diffHours ;

    long diffMinutes ;

       public Date getstart() {

              return this.startTime;

       }

       public void setstart(Date start) {

              this.startTime=start;

       }

       public Date getend() {

              return this.endTime;

       }

       public void setend(Date end) {

              this.endTime=end;

       }

       public String getcall() {

              return this.calladdressareacode;

       }

       public void setcall(String call) {

              this.calladdressareacode=call;

       }

       public String getanswer() {

              return this.answeraddress;

       }

       public void setanswer(String answer) {

              this.answeraddress=answer;

       }

       public void setmessage(String message) {

              this.message=message;

       }

       public int cal(){

              int length=0;

              length=message.length()/10;

              if(message.length()%10>0) {

                     length++;

              }

              return length;

       }

}(3)踩坑心得:

1.格式问题

在本次大作业中 做好格式的判断尤为重要 格式判断的占分比很大。

(4)改进建议:

想好了在写:

在面对工作量较为庞大的题目时,先停下来好好思考一下要建立几个类,每个类分别对应的职责是什么。让不同类对应其相应的元素,使得代码条理清晰,逻辑顺畅。

(5):总结:

从上次博客至今,我学习并掌握了继承与多态以及hashset容器的运用;通过老师公布的三角形类大作业的设计,学习到了如何简单的运用类与方法去判断输入的字符串的格式是否错误以及如何从输入的字符串中将点提取出来(在一开始的三角形类中我只会用一个很庞大的正则表达式去判断是否符合格式,这样会导致很多错误情况遗漏的问题)。

对于输入的数据的格式判断格式仍需细化,代码逻辑的处理仍需加强。

希望在作业结束提交之后能够有参考答案或者老师能在课上对一些正确率较低的题目进行讲解,或者将每个测试点给出来。

posted on   求求你去看约战4吧  阅读(27)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示