第三次博客作业

第三次博客作业

一、  前言

又经过一段时间的学习,我在Java这门课程上又多学到了一些知识点。难度方面,或许是为了减轻一些我们在Java这门课程上的压力,最近三次的PTA作业简单了一些。基本上只要投入了足够的时间就可以完成,并且这三次作业也是迭代的。题量方面,这三次作业题量都很少,只有两三道题目。大概是因为网课上得太久了,做PTA的心情有点懈怠,好在我还是及时地完成了。这三次作业情况如下:

1.   题目集08

知识点主要有:容器,集合的应用,接口的实现,继承等。

2.   题目集09

知识点主要有:有序集合,迭代器以及题目集08中的知识点。

3.   题目集10

知识点主要有:正则表达式的应用,字符串的处理,多态的应用以及上一个题目集中的知识点。

 

二、  设计与分析

下面我将要对这三次的题目集进行详细分析,重点是对源码的分析,解释和完成题目后的心得。分析如下:(以下均是我个人的理解,可能与标准说法不同,请见谅)

1.   题目集08

7-1 电信计费系列1-座机计费

    本题思路是先将输入的不同信息储存至不同的数组中,同时判断是否有重复的信息,再进行实例化:如果输入的是开户的信息,那么先存入一个字符串数组,判断无重复信息后,对于每条开户信息创建一个User对象,储存至一个只存入User对象的容器中;如果输入的是通讯记录,同上,存入不同的数组和容器中。之后,对每条通讯记录进行详细操作。在判断通讯记录的格式时,所用的正则表达式非常繁琐,主要是后面日期格式的判断不容易实现。

源码如下:

import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws ParseException {
		Scanner in = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
		DecimalFormat d = new DecimalFormat("0.0");
		ArrayList<User> Users = new ArrayList<User>();
		String[] str = new String[100];
		String[] users = new String[100];
		String[] userRecords = new String[100];
		int c=0,k=0,m=0;
		for(int i=0;;i++) {
			str[i]=in.nextLine();
			c++;
			if(str[i].contains("end"))
				break;
		}
		
		for(int i=0;i<c-1;i++) {
			if(str[i].matches("u-0791[\\d]{7,8} 0")) {
				boolean exist = false;
				for(int j=0;j<k;j++) {
					if(users[j].equals(str[i]))
						exist = true;
				}
				if(!exist) {
					users[k] = str[i];
					k++;
				}
			}else if(str[i].matches("t-(\\d){11,12}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
				
				userRecords[m] = str[i];
				m++;
			}
		}
		
		for(int i=0;i<k;i++) {
			Users.add(new User(users[i]));
			for(int j=0;j<m;j++) {
				String[] sub = userRecords[j].split(" ");
				if(sub[0].substring(2,sub[0].length()).matches(Users.get(i).getNumber())) {
					if(sub[1].substring(0, 4).matches("0791"))
						Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));
					else if(sub[1].substring(0, 4).matches("(079\\d)|(0701)"))
						Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));
					else
						Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));
				}
			}
		}
		
		
		Collections.sort(Users);
		for(User e:Users) {
			System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));
		}
		
	}

}

class User implements Comparable<User>{
	UserRecord userRecords = new UserRecord();
	private double balance = 100;
	private ChargeMode chargeMode;
	private String number;
	
	public User(String str) {
		this.number = str.substring(2,str.length()-2);
		if(str.charAt(str.length()-1) == '0')
			this.setChargeMode(new LandPhoneCharge());
	}
	
	public double calBalance() {
		return balance-chargeMode.getMonthlyRent()-calCost();
	}
	public double calCost() {
		double cost1 = 0,cost2 = 0,cost3 = 0;
		
		for(int i=0;i<userRecords.getCallInCity().size();i++) {
			long time = userRecords.getCallInCity().get(i).getEnd().getTime()-userRecords.getCallInCity().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost1 += 0.1*(time/(1000*60));
			else
				cost1 += 0.1*(time/(1000*60)+1);
		}
		for(int i=0;i<userRecords.getCallInProvince().size();i++) {
			long time = userRecords.getCallInProvince().get(i).getEnd().getTime()-userRecords.getCallInProvince().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost2 += 0.3*(time/(1000*60));
			else
				cost2 += 0.3*(time/(1000*60)+1);
		}
		for(int i=0;i<userRecords.getCallInLand().size();i++) {
			long time = userRecords.getCallInLand().get(i).getEnd().getTime()-userRecords.getCallInLand().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost3 += 0.6*(time/(1000*60));
			else
				cost3 += 0.6*(time/(1000*60)+1);
		}
		return cost1+cost2+cost3;
		
	}
	public UserRecord getUserRecords() {
		return userRecords;
	}
	public void setUserRecords(UserRecord ur) {
		userRecords = ur;
	}
	public double getBalance() {
		return balance;
	}
	public ChargeMode getChargeMode() {
		return chargeMode;
	}
	public void setChargeMode(ChargeMode cm) {
		chargeMode = cm;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String n) {
		number = n;
	}

	@Override
	public int compareTo(User o) {
		return this.getNumber().compareTo(o.getNumber());
	}
}

class UserRecord{
	private ArrayList<CallRecord> callInCity = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> callInProvince = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> callInLand = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInCity = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInProvince = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInLand = new ArrayList<CallRecord>();
	private ArrayList<MessageRecord> sendMessage = new ArrayList<MessageRecord>();
	private ArrayList<MessageRecord> receiveMessage = new ArrayList<MessageRecord>();
	
	public void addCallInCity(CallRecord cr) {
		callInCity.add(cr);
	}
	public void addCallInProvince(CallRecord cr) {
		callInProvince.add(cr);
	}
	public void addCallInLand(CallRecord cr) {
		callInLand.add(cr);
	}
	public void addAnswerInCity(CallRecord cr) {
		answerInCity.add(cr);
	}
	public void addAnswerInProvince(CallRecord cr) {
		answerInProvince.add(cr);
	}
	public void addAnswerInLand(CallRecord cr) {
		answerInLand.add(cr);
	}
	public void addSendMessage(MessageRecord mr) {
		sendMessage.add(mr);
	}
	public void addReceiveMessage(MessageRecord mr) {
		receiveMessage.add(mr);
	}
	public ArrayList<CallRecord> getCallInCity() {
		return callInCity;
	}
	public ArrayList<CallRecord> getCallInProvince() {
		return callInProvince;
	}
	public ArrayList<CallRecord> getCallInLand() {
		return callInLand;
	}
	public ArrayList<CallRecord> getAnswerInCity() {
		return answerInCity;
	}
	public ArrayList<CallRecord> getAnswerInProvince() {
		return answerInProvince;
	}
	public ArrayList<CallRecord> getAnswerInLand() {
		return answerInLand;
	}
	public ArrayList<MessageRecord> getSendMessage() {
		return sendMessage;
	}
	public ArrayList<MessageRecord> getReceiveMessage() {
		return receiveMessage;
	}
}

abstract class ChargeMode{
	private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
	
	public ArrayList<ChargeRule> getChargeRules(){
		return chargeRules;
	}
	public void setChargeRules(ArrayList<ChargeRule> cr) {
		chargeRules = cr;
	}
	public double calCost(UserRecord ur) {
		return 0;
	}
	public double getMonthlyRent() {
		return 20;
	}
}

class LandPhoneCharge extends ChargeMode{
	private double monthlyRent = 20;
	
	@Override
	public double calCost(UserRecord ur) {
		return 0;
	}
	@Override
	public double getMonthlyRent() {
		return monthlyRent;
	}
}

abstract class ChargeRule{
	
}

abstract class CallChangeRule extends ChargeRule{
	public double calCost(ArrayList<CallRecord> cr) {
		return 0;
	}
}

class CityRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

class ProvinceRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

class LandRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

abstract class CommunicationRecord{
	String callNumber;
	String answerNumber;
	
	public String getCallNumber() {
		return callNumber;
	}
	public void setCallNumber(String cn) {
		callNumber = cn;
	}
	public String getAnswerNumber() {
		return answerNumber;
	}
	public void setAnswerNumber(String an) {
		answerNumber = an;
	}
}

class CallRecord extends CommunicationRecord{
	private Date start;
	private Date end;
	private String callCode;
	private String answerCode;
	
	public CallRecord(Date start,Date end) {
		this.start = start;
		this.end = end;
	}
	
	public Date getStart() {
		return start;
	}
	public void setStart(Date start) {
		this.start = start;
	}
	public Date getEnd() {
		return end;
	}
	public void setEnd(Date end) {
		this.end = end;
	}
	public String getCallCode() {
		return callCode;
	}
	public void setCallCode(String callCode) {
		this.callCode = callCode;
	}
	public String getAnswerCode() {
		return answerCode;
	}
	public void setAnswerCode(String answerCode) {
		this.answerCode = answerCode;
	}
	
}

class MessageRecord extends CommunicationRecord{
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}

  

2.   题目集09

7-1 电信计费系列2-手机+座机计费

 

本题是在题目集08第一题的基础上进行改进,增加了手机用户。在处理每条有手机用户的通讯记录时,同时需要判断手机用户所在的地区。总而言之,通讯记录的判断和处理更加详细,也更加繁琐了。需要创建手机用户的计费方式,之后在主函数中增加和修改亿点点就可以完成了。因为当时有点懈怠,做的时间比较晚,所以只得了97分,差3分,有点可惜。源码如下(部分):

public class Main {

	public static void main(String[] args) throws ParseException {
		Scanner in = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
		DecimalFormat d = new DecimalFormat("0.0");
		ArrayList<User> Users = new ArrayList<>();
		String[] str = new String[100];
		String[] users = new String[100];
		String[] userRecords = new String[100];
		int c=0,k=0,m=0;
		for(int i=0;;i++) {
			str[i]=in.nextLine();
			c++;
			if(str[i].contains("end"))
				break;
		}
		
		for(int i=0;i<c-1;i++) {
			if(str[i].matches("u-0791[\\d]{7,8} 0")||str[i].matches("u-1[\\d]{10} 1")) {
				boolean exist = false;
				for(int j=0;j<k;j++) {
					if(users[j].equals(str[i]))
						exist = true;
				}
				if(!exist) {
					users[k] = str[i];
					k++;
				}
			}else if(str[i].matches("t-0(\\d){9,11}\\s0(\\d){9,11}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
				
				userRecords[m] = str[i];
				m++;
			}else if(str[i].matches("t-1(\\d){10}\\s0(\\d){2,3}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
				
				userRecords[m] = str[i];
				m++;
			}else if(str[i].matches("t-0(\\d){9,11}\\s1(\\d){10}\\s(\\d){3,4}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
				
				userRecords[m] = str[i];
				m++;
			}else if(str[i].matches("t-1(\\d){10}\\s0(\\d){2,3}\\s1(\\d){10}\\s0(\\d){2,3}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
				
				userRecords[m] = str[i];
				m++;
			}
			
		}
		
		for(int i=0;i<k;i++) {
			Users.add(new User(users[i]));
		}
		
		for(int i=0;i<k;i++) {
			for(int j=0;j<m;j++) {
				String[] sub = userRecords[j].split(" ");
				if(sub[0].substring(2,sub[0].length()).matches(Users.get(i).getNumber())) {
					if(sub[1].matches("0791[\\d]{7,8}"))
						Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));
					else if(sub[1].matches("((079[\\d])|(0701))[\\d]{7,8}"))
						Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));
					else if(sub[1].matches("0(\\d){9,11}"))
						Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));
					else if(sub[2].matches("0791[\\d]{7,8}"))
						Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));
					else if(sub[2].matches("((079[\\d])|(0701))[\\d]{7,8}"))
						Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));
					else if(sub[2].matches("0(\\d){9,11}"))
						Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));
					else if(sub[2].matches("0791")) {
						Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));
						
					}else if(sub[2].matches("(079[\\d])|(0701)")) {
						Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));
						
					}else if(sub[2].matches("0(\\d){2,3}")) {
						Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));
					}else if(sub[3].matches("0791")) {
						Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));
						
					}else if(sub[3].matches("(079[\\d])|(0701)")) {
						Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));
						
					}else if(sub[3].matches("0(\\d){2,3}")) {
						Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));
					}
					
				}else if(sub[1].matches(Users.get(i).getNumber())) {
					if(sub[0].substring(2,6).matches("0791"))
							continue;
					else if(sub[0].substring(2,6).matches("(079[\\d])|(0701)"))
						continue;
					else if(sub[0].substring(2,6).matches("0(\\d){3}")) {
						Users.get(i).userRecords.addAnswerInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[2]));
					}
				}else if(sub[2].matches(Users.get(i).getNumber())) {
					if(sub[1].matches("0791"))
						continue;
					else if(sub[1].matches("(079[\\d])|(0701)"))
						continue;
					else if(sub[1].matches("0(\\d){2,3}")) {
						Users.get(i).userRecords.addAnswerInLand(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));
					}
				}
			}
		}
		
		
		Collections.sort(Users);
		for(User e:Users) {
			System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));
		}
		
	}

}
手机用户的计费方式如下:
	class MovePhoneCharge extends ChargeMode{
	private double monthlyRent = 15;
	
	@Override
	public double calCost(UserRecord userRecords) {
		double cost1 = 0,cost2 = 0,cost3 = 0,cost4 = 0;
		double rate1 = 0,rate2 = 0,rate3 = 0;
		
		for(int i=0;i<userRecords.getCallInCity().size();i++) {
			if(userRecords.getCallInCity().get(i).getCallCode().split(" ")[1].matches("0791"))
				rate1 = 0.1;
			else if(userRecords.getCallInCity().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))
				rate1 = 0.3;
			else
				rate1 = 0.6;
			
			long time = userRecords.getCallInCity().get(i).getEnd().getTime()-userRecords.getCallInCity().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost1 += rate1*(time/(1000*60));
			else
				cost1 += rate1*(time/(1000*60)+1);
		}
		for(int i=0;i<userRecords.getCallInProvince().size();i++) {
			if(userRecords.getCallInProvince().get(i).getCallCode().split(" ")[1].matches("0791"))
				rate2 = 0.2;
			else if(userRecords.getCallInProvince().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))
				rate2 = 0.3;
			else
				rate2 = 0.6;
			long time = userRecords.getCallInProvince().get(i).getEnd().getTime()-userRecords.getCallInProvince().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost2 += rate2*(time/(1000*60));
			else
				cost2 += rate2*(time/(1000*60)+1);
		}
		for(int i=0;i<userRecords.getCallInLand().size();i++) {
			if(userRecords.getCallInLand().get(i).getCallCode().split(" ")[1].matches("0791"))
				rate3 = 0.3;
			else if(userRecords.getCallInLand().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))
				rate3 = 0.3;
			else
				rate3 = 0.6;
			long time = userRecords.getCallInLand().get(i).getEnd().getTime()-userRecords.getCallInLand().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost3 += rate3*(time/(1000*60));
			else
				cost3 += rate3*(time/(1000*60)+1);
		}
		for(int i=0;i<userRecords.getAnswerInLand().size();i++) {
			long time = userRecords.getAnswerInLand().get(i).getEnd().getTime()-userRecords.getAnswerInLand().get(i).getStart().getTime();
			if(time%(1000*60)==0)
				cost4 += 0.3*(time/(1000*60));
			else
				cost4 += 0.3*(time/(1000*60)+1);
		}
		return cost1+cost2+cost3+cost4;
	}
	@Override
	public double getMonthlyRent() {
		return monthlyRent;
	}
}

  

3.   题目集10

7-1 电信计费系列3-短信计费

 

本题只需要考虑开户信息和短信,在题目集09的基础上进行一些删改就可以完成了。可以说,这次题目集是这三次作业中最轻松的一次了,因为之前都把基础做好了。源码如下:

import java.util.Date;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws ParseException {
		Scanner in = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
		DecimalFormat d = new DecimalFormat("0.0");
		ArrayList<User> Users = new ArrayList<>();
		String[] str = new String[100];
		String[] users = new String[100];
		String[] userRecords = new String[100];
		int c=0,k=0,m=0;
		for(int i=0;;i++) {
			str[i]=in.nextLine();
			c++;
			if(str[i].contains("end"))
				break;
		}
		
		for(int i=0;i<c-1;i++) {
			if(str[i].matches("u-1\\d{10} 3")) {
				boolean exist = false;
				for(int j=0;j<k;j++) {
					if(users[j].equals(str[i]))
						exist = true;
				}
				if(!exist) {
					users[k] = str[i];
					k++;
				}
			}else if(str[i].matches("m-1\\d{10} 1\\d{10} ([\\d]|[A-Z]|[a-z]| |\\.|\\,)*")) {
				userRecords[m] = str[i];
				m++;
			}
			
		}
		
		for(int i=0;i<k;i++) {
            Users.add(new User(users[i]));
			for(int j=0;j<m;j++) {
				if(userRecords[j].substring(2,13).matches(Users.get(i).getNumber())) {
					Users.get(i).userRecords.addSendMessage(new MessageRecord(userRecords[j].substring(26)));
				}
			}
		}
		
		
		Collections.sort(Users);
		for(User e:Users) {
			System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));
		}
		
	}

}

class User implements Comparable<User>{
	UserRecord userRecords = new UserRecord();
	private double balance = 100;
	private ChargeMode chargeMode;
	private String number;
	
	public User(String str) {
		this.number = str.substring(2,str.length()-2);
		if(str.charAt(str.length()-1) == '3')
			this.setChargeMode(new MovePhoneMessageCharge());
	}
	
	public double calBalance() {
		return balance-chargeMode.getMonthlyRent()-calCost();
	}
	public double calCost() {
		return chargeMode.calCost(userRecords);
		
	}
	public UserRecord getUserRecords() {
		return userRecords;
	}
	public void setUserRecords(UserRecord ur) {
		userRecords = ur;
	}
	public double getBalance() {
		return balance;
	}
	public ChargeMode getChargeMode() {
		return chargeMode;
	}
	public void setChargeMode(ChargeMode cm) {
		chargeMode = cm;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String n) {
		number = n;
	}

	@Override
	public int compareTo(User o) {
		return this.getNumber().compareTo(o.getNumber());
	}
}

class UserRecord{
	private ArrayList<CallRecord> callInCity = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> callInProvince = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> callInLand = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInCity = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInProvince = new ArrayList<CallRecord>();
	private ArrayList<CallRecord> answerInLand = new ArrayList<CallRecord>();
	private ArrayList<MessageRecord> sendMessage = new ArrayList<MessageRecord>();
	private ArrayList<MessageRecord> receiveMessage = new ArrayList<MessageRecord>();
	
	public void addCallInCity(CallRecord cr) {
		callInCity.add(cr);
	}
	public void addCallInProvince(CallRecord cr) {
		callInProvince.add(cr);
	}
	public void addCallInLand(CallRecord cr) {
		callInLand.add(cr);
	}
	public void addAnswerInCity(CallRecord cr) {
		answerInCity.add(cr);
	}
	public void addAnswerInProvince(CallRecord cr) {
		answerInProvince.add(cr);
	}
	public void addAnswerInLand(CallRecord cr) {
		answerInLand.add(cr);
	}
	public void addSendMessage(MessageRecord mr) {
		sendMessage.add(mr);
	}
	public void addReceiveMessage(MessageRecord mr) {
		receiveMessage.add(mr);
	}
	public ArrayList<CallRecord> getCallInCity() {
		return callInCity;
	}
	public ArrayList<CallRecord> getCallInProvince() {
		return callInProvince;
	}
	public ArrayList<CallRecord> getCallInLand() {
		return callInLand;
	}
	public ArrayList<CallRecord> getAnswerInCity() {
		return answerInCity;
	}
	public ArrayList<CallRecord> getAnswerInProvince() {
		return answerInProvince;
	}
	public ArrayList<CallRecord> getAnswerInLand() {
		return answerInLand;
	}
	public ArrayList<MessageRecord> getSendMessage() {
		return sendMessage;
	}
	public ArrayList<MessageRecord> getReceiveMessage() {
		return receiveMessage;
	}
}

abstract class ChargeMode{
	private ArrayList<ChargeRule> chargeRules = new ArrayList<>();
	
	public ArrayList<ChargeRule> getChargeRules(){
		return chargeRules;
	}
	public void setChargeRules(ArrayList<ChargeRule> cr) {
		chargeRules = cr;
	}
	public double calCost(UserRecord ur) {
		return 0;
	}
	public double getMonthlyRent() {
		return 20;
	}
}


class MovePhoneMessageCharge extends ChargeMode{
	private double monthlyRent = 0;
	
	public double calCost(UserRecord userRecords) {
		double cost = 0;
		int ml = 0;
        double cal = 0;
		for(int i=0;i<userRecords.getSendMessage().size();i++) {
			cal = userRecords.getSendMessage().get(i).getMessage().length()/10.0;
            if(cal%1!=0)
                cal = cal+1.0;
			ml += (int)cal;
		}
		if(ml<=3)
			cost = 0.1*ml;
		else if(ml<=5)
			cost = 0.3+0.2*(ml-3);
		else if(ml>5)
			cost = 0.7+0.3*(ml-5);
		return cost;
	}
	@Override
	public double getMonthlyRent() {
		return monthlyRent;
	}
}

abstract class ChargeRule{
	
}

abstract class CallChangeRule extends ChargeRule{
	public double calCost(ArrayList<CallRecord> cr) {
		return 0;
	}
}

class CityRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

class ProvinceRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

class LandRule extends CallChangeRule{
	@Override
	public double calCost(ArrayList<CallRecord> cr) {
		// TODO Auto-generated method stub
		return super.calCost(cr);
	}
}

abstract class CommunicationRecord{
	String callNumber;
	String answerNumber;
	
	public String getCallNumber() {
		return callNumber;
	}
	public void setCallNumber(String cn) {
		callNumber = cn;
	}
	public String getAnswerNumber() {
		return answerNumber;
	}
	public void setAnswerNumber(String an) {
		answerNumber = an;
	}
}

class CallRecord extends CommunicationRecord{
	private Date start;
	private Date end;
	private String callCode;
	private String answerCode;
	
	public CallRecord(Date start,Date end ,String callCode, String answerCode) {
		this.start = start;
		this.end = end;
		this.callCode = callCode;
		this.answerCode = answerCode;
	}
	
	public Date getStart() {
		return start;
	}
	public void setStart(Date start) {
		this.start = start;
	}
	public Date getEnd() {
		return end;
	}
	public void setEnd(Date end) {
		this.end = end;
	}
	public String getCallCode() {
		return callCode;
	}
	public void setCallCode(String callCode) {
		this.callCode = callCode;
	}
	public String getAnswerCode() {
		return answerCode;
	}
	public void setAnswerCode(String answerCode) {
		this.answerCode = answerCode;
	}
	
}

class MessageRecord extends CommunicationRecord{
	private String message;

	public MessageRecord(String m) {
		message = m;
	}
	
	public String getMessage() {
		return message;
	}

}

 

 三、 采坑心得

在完成这3次题目集的过程中,我遇到了一些的问题,下面将对我遇到一些的问题分享一下我的心得:

首先,日期的转化问题。将字符串按格式转化为日期时,需要在转化发生的函数后面

加上throws ParseException,也就是需要抛出异常;其次,用户排序的问题。一开始我使用的是for循环来进行排序,测试用例的输出结果是正确的,但是一直过不了测试点。在和室友的排序方法进行对比后,我发现了问题所在,于是采用了Collections.sort(Users)这种方式来进行排序,顺利地通过了全部测试点。

四、  改进建议

前面说道,我判断通讯记录的正则表达式十分繁琐,这是一个急需改进的地方。SimpleDateFormat类可以对日期进行格式化,可是我对此并没有很了解,应用起来十分困难,希望之后可以熟练应用。

五、  总结

在完成这三次题目集的过程中,我遇到了很多困难,也收获了很多知识点。尽管我总是被难题虐到心累,我还是愿意继续不断的尝试,直到正确。之后,我需要学习和改进的地方还有很多,但是我会尽量使自己变得更优秀。靠自己的努力得到的满分,才是满满的成就感!

 

第三次博客作业

一、  前言

又经过一段时间的学习,我在Java这门课程上又多学到了一些知识点。难度方面,或许是为了减轻一些我们在Java这门课程上的压力,最近三次的PTA作业简单了一些。基本上只要投入了足够的时间就可以完成,并且这三次作业也是迭代的。题量方面,这三次作业题量都很少,只有两三道题目。大概是因为网课上得太久了,做PTA的心情有点懈怠,好在我还是及时地完成了。这三次作业情况如下:

1.   题目集08

知识点主要有:容器,集合的应用,接口的实现,继承等。

2.   题目集09

知识点主要有:有序集合,迭代器以及题目集08中的知识点。

3.   题目集10

知识点主要有:正则表达式的应用,字符串的处理,多态的应用以及上一个题目集中的知识点。

 

二、  设计与分析

下面我将要对这三次的题目集进行详细分析,重点是对源码的分析,解释和完成题目后的心得。分析如下:(以下均是我个人的理解,可能与标准说法不同,请见谅)

1.   题目集08

7-1 电信计费系列1-座机计费

    本题思路是先将输入的不同信息储存至不同的数组中,同时判断是否有重复的信息,再进行实例化:如果输入的是开户的信息,那么先存入一个字符串数组,判断无重复信息后,对于每条开户信息创建一个User对象,储存至一个只存入User对象的容器中;如果输入的是通讯记录,同上,存入不同的数组和容器中。之后,对每条通讯记录进行详细操作。在判断通讯记录的格式时,所用的正则表达式非常繁琐,主要是后面日期格式的判断不容易实现。

源码如下:

import java.util.Date;

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Scanner;

 

public class Main {

 

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

        Scanner in = new Scanner(System.in);

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

        DecimalFormat d = new DecimalFormat("0.0");

        ArrayList<User> Users = new ArrayList<User>();

        String[] str = new String[100];

        String[] users = new String[100];

        String[] userRecords = new String[100];

        int c=0,k=0,m=0;

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

            str[i]=in.nextLine();

            c++;

            if(str[i].contains("end"))

                break;

        }

       

        for(int i=0;i<c-1;i++) {

            if(str[i].matches("u-0791[\\d]{7,8} 0")) {

                boolean exist = false;

                for(int j=0;j<k;j++) {

                   if(users[j].equals(str[i]))

                       exist = true;

                }

                if(!exist) {

                   users[k] = str[i];

                   k++;

                }

            }else if(str[i].matches("t-(\\d){11,12}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){

               

                userRecords[m] = str[i];

                m++;

            }

        }

       

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

            Users.add(new User(users[i]));

            for(int j=0;j<m;j++) {

                String[] sub = userRecords[j].split(" ");

                if(sub[0].substring(2,sub[0].length()).matches(Users.get(i).getNumber())) {

                   if(sub[1].substring(0, 4).matches("0791"))

                       Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));

                    else if(sub[1].substring(0, 4).matches("(079\\d)|(0701)"))

                       Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));

                   else

                       Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5])));

                }

            }

        }

       

       

        Collections.sort(Users);

        for(User e:Users) {

            System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));

        }

       

    }

 

}

 

class User implements Comparable<User>{

    UserRecord userRecords = new UserRecord();

    private double balance = 100;

    private ChargeMode chargeMode;

    private String number;

   

    public User(String str) {

        this.number = str.substring(2,str.length()-2);

        if(str.charAt(str.length()-1) == '0')

            this.setChargeMode(new LandPhoneCharge());

    }

   

    public double calBalance() {

        return balance-chargeMode.getMonthlyRent()-calCost();

    }

    public double calCost() {

        double cost1 = 0,cost2 = 0,cost3 = 0;

       

        for(int i=0;i<userRecords.getCallInCity().size();i++) {

            long time = userRecords.getCallInCity().get(i).getEnd().getTime()-userRecords.getCallInCity().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost1 += 0.1*(time/(1000*60));

            else

                cost1 += 0.1*(time/(1000*60)+1);

        }

        for(int i=0;i<userRecords.getCallInProvince().size();i++) {

            long time = userRecords.getCallInProvince().get(i).getEnd().getTime()-userRecords.getCallInProvince().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost2 += 0.3*(time/(1000*60));

            else

                cost2 += 0.3*(time/(1000*60)+1);

        }

        for(int i=0;i<userRecords.getCallInLand().size();i++) {

            long time = userRecords.getCallInLand().get(i).getEnd().getTime()-userRecords.getCallInLand().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost3 += 0.6*(time/(1000*60));

            else

                cost3 += 0.6*(time/(1000*60)+1);

        }

        return cost1+cost2+cost3;

       

    }

    public UserRecord getUserRecords() {

        return userRecords;

    }

    public void setUserRecords(UserRecord ur) {

        userRecords = ur;

    }

    public double getBalance() {

        return balance;

    }

    public ChargeMode getChargeMode() {

        return chargeMode;

    }

    public void setChargeMode(ChargeMode cm) {

        chargeMode = cm;

    }

    public String getNumber() {

        return number;

    }

    public void setNumber(String n) {

        number = n;

    }

 

    @Override

    public int compareTo(User o) {

        return this.getNumber().compareTo(o.getNumber());

    }

}

 

class UserRecord{

    private ArrayList<CallRecord> callInCity = new ArrayList<CallRecord>();

    private ArrayList<CallRecord> callInProvince = new ArrayList<CallRecord>();

    private ArrayList<CallRecord> callInLand = new ArrayList<CallRecord>();

    private ArrayList<CallRecord> answerInCity = new ArrayList<CallRecord>();

   private ArrayList<CallRecord> answerInProvince = new ArrayList<CallRecord>();

    private ArrayList<CallRecord> answerInLand = new ArrayList<CallRecord>();

    private ArrayList<MessageRecord> sendMessage = new ArrayList<MessageRecord>();

    private ArrayList<MessageRecord> receiveMessage = new ArrayList<MessageRecord>();

   

    public void addCallInCity(CallRecord cr) {

        callInCity.add(cr);

    }

    public void addCallInProvince(CallRecord cr) {

        callInProvince.add(cr);

    }

    public void addCallInLand(CallRecord cr) {

        callInLand.add(cr);

    }

    public void addAnswerInCity(CallRecord cr) {

        answerInCity.add(cr);

    }

    public void addAnswerInProvince(CallRecord cr) {

        answerInProvince.add(cr);

    }

    public void addAnswerInLand(CallRecord cr) {

        answerInLand.add(cr);

    }

    public void addSendMessage(MessageRecord mr) {

        sendMessage.add(mr);

    }

    public void addReceiveMessage(MessageRecord mr) {

        receiveMessage.add(mr);

    }

    public ArrayList<CallRecord> getCallInCity() {

        return callInCity;

    }

    public ArrayList<CallRecord> getCallInProvince() {

        return callInProvince;

    }

    public ArrayList<CallRecord> getCallInLand() {

        return callInLand;

    }

    public ArrayList<CallRecord> getAnswerInCity() {

        return answerInCity;

    }

    public ArrayList<CallRecord> getAnswerInProvince() {

        return answerInProvince;

    }

    public ArrayList<CallRecord> getAnswerInLand() {

        return answerInLand;

    }

    public ArrayList<MessageRecord> getSendMessage() {

        return sendMessage;

    }

    public ArrayList<MessageRecord> getReceiveMessage() {

        return receiveMessage;

    }

}

 

abstract class ChargeMode{

    private ArrayList<ChargeRule> chargeRules = new ArrayList<>();

   

    public ArrayList<ChargeRule> getChargeRules(){

        return chargeRules;

    }

    public void setChargeRules(ArrayList<ChargeRule> cr) {

        chargeRules = cr;

    }

    public double calCost(UserRecord ur) {

        return 0;

    }

    public double getMonthlyRent() {

        return 20;

    }

}

 

class LandPhoneCharge extends ChargeMode{

    private double monthlyRent = 20;

   

    @Override

    public double calCost(UserRecord ur) {

        return 0;

    }

    @Override

    public double getMonthlyRent() {

        return monthlyRent;

    }

}

 

abstract class ChargeRule{

   

}

 

abstract class CallChangeRule extends ChargeRule{

    public double calCost(ArrayList<CallRecord> cr) {

        return 0;

    }

}

 

class CityRule extends CallChangeRule{

    @Override

    public double calCost(ArrayList<CallRecord> cr) {

        // TODO Auto-generated method stub

        return super.calCost(cr);

    }

}

 

class ProvinceRule extends CallChangeRule{

    @Override

    public double calCost(ArrayList<CallRecord> cr) {

        // TODO Auto-generated method stub

        return super.calCost(cr);

    }

}

 

class LandRule extends CallChangeRule{

    @Override

    public double calCost(ArrayList<CallRecord> cr) {

        // TODO Auto-generated method stub

        return super.calCost(cr);

    }

}

 

abstract class CommunicationRecord{

    String callNumber;

    String answerNumber;

   

    public String getCallNumber() {

        return callNumber;

    }

    public void setCallNumber(String cn) {

        callNumber = cn;

    }

    public String getAnswerNumber() {

        return answerNumber;

    }

    public void setAnswerNumber(String an) {

        answerNumber = an;

    }

}

 

class CallRecord extends CommunicationRecord{

    private Date start;

    private Date end;

    private String callCode;

    private String answerCode;

   

    public CallRecord(Date start,Date end) {

        this.start = start;

        this.end = end;

    }

   

    public Date getStart() {

        return start;

    }

    public void setStart(Date start) {

        this.start = start;

    }

    public Date getEnd() {

        return end;

    }

    public void setEnd(Date end) {

        this.end = end;

    }

    public String getCallCode() {

        return callCode;

    }

    public void setCallCode(String callCode) {

        this.callCode = callCode;

    }

    public String getAnswerCode() {

        return answerCode;

    }

    public void setAnswerCode(String answerCode) {

        this.answerCode = answerCode;

    }

   

}

 

class MessageRecord extends CommunicationRecord{

    private String message;

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

}

2.   题目集09

7-1 电信计费系列2-手机+座机计费

本题是在题目集08第一题的基础上进行改进,增加了手机用户。在处理每条有手机用户的通讯记录时,同时需要判断手机用户所在的地区。总而言之,通讯记录的判断和处理更加详细,也更加繁琐了。需要创建手机用户的计费方式,之后在主函数中增加和修改亿点点就可以完成了。因为当时有点懈怠,做的时间比较晚,所以只得了97分,差3分,有点可惜。源码如下(部分):

public class Main {

 

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

        Scanner in = new Scanner(System.in);

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

        DecimalFormat d = new DecimalFormat("0.0");

        ArrayList<User> Users = new ArrayList<>();

        String[] str = new String[100];

        String[] users = new String[100];

        String[] userRecords = new String[100];

        int c=0,k=0,m=0;

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

            str[i]=in.nextLine();

            c++;

            if(str[i].contains("end"))

                break;

        }

       

        for(int i=0;i<c-1;i++) {

            if(str[i].matches("u-0791[\\d]{7,8} 0")||str[i].matches("u-1[\\d]{10} 1")) {

                boolean exist = false;

                for(int j=0;j<k;j++) {

                   if(users[j].equals(str[i]))

                       exist = true;

                }

                if(!exist) {

                   users[k] = str[i];

                   k++;

                }

            }else if(str[i].matches("t-0(\\d){9,11}\\s0(\\d){9,11}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){

               

                userRecords[m] = str[i];

                m++;

            }else if(str[i].matches("t-1(\\d){10}\\s0(\\d){2,3}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){

               

                userRecords[m] = str[i];

                m++;

            }else if(str[i].matches("t-0(\\d){9,11}\\s1(\\d){10}\\s(\\d){3,4}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){

               

                userRecords[m] = str[i];

                m++;

            }else if(str[i].matches("t-1(\\d){10}\\s0(\\d){2,3}\\s1(\\d){10}\\s0(\\d){2,3}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){

               

                userRecords[m] = str[i];

                m++;

            }

           

        }

       

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

            Users.add(new User(users[i]));

        }

       

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

            for(int j=0;j<m;j++) {

                String[] sub = userRecords[j].split(" ");

              if(sub[0].substring(2,sub[0].length()).matches(Users.get(i).getNumber())) {

                   if(sub[1].matches("0791[\\d]{7,8}"))

                       Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));

                   else if(sub[1].matches("((079[\\d])|(0701))[\\d]{7,8}"))

                       Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));

                   else if(sub[1].matches("0(\\d){9,11}"))

                       Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[2]+" "+sub[3]), sdf.parse(sub[4]+" "+sub[5]),sub[0],sub[1]));

                   else if(sub[2].matches("0791[\\d]{7,8}"))

                       Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));

                   else if(sub[2].matches("((079[\\d])|(0701))[\\d]{7,8}"))

                       Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));

                   else if(sub[2].matches("0(\\d){9,11}"))

                       Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0]+" "+sub[1],sub[2]));

                   else if(sub[2].matches("0791")) {

                       Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));

                      

                   }else if(sub[2].matches("(079[\\d])|(0701)")) {

                       Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));

                      

                   }else if(sub[2].matches("0(\\d){2,3}")) {

                       Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[1]));

                   }else if(sub[3].matches("0791")) {

                       Users.get(i).userRecords.addCallInCity(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));

                      

                   }else if(sub[3].matches("(079[\\d])|(0701)")) {

                       Users.get(i).userRecords.addCallInProvince(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));

                      

                   }else if(sub[3].matches("0(\\d){2,3}")) {

                       Users.get(i).userRecords.addCallInLand(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));

                   }

                  

                }else if(sub[1].matches(Users.get(i).getNumber())) {

                   if(sub[0].substring(2,6).matches("0791"))

                           continue;

                   else if(sub[0].substring(2,6).matches("(079[\\d])|(0701)"))

                       continue;

                   else if(sub[0].substring(2,6).matches("0(\\d){3}")) {

                       Users.get(i).userRecords.addAnswerInLand(new CallRecord(sdf.parse(sub[3]+" "+sub[4]), sdf.parse(sub[5]+" "+sub[6]),sub[0],sub[2]));

                   }

                }else if(sub[2].matches(Users.get(i).getNumber())) {

                   if(sub[1].matches("0791"))

                       continue;

                   else if(sub[1].matches("(079[\\d])|(0701)"))

                       continue;

                   else if(sub[1].matches("0(\\d){2,3}")) {

                       Users.get(i).userRecords.addAnswerInLand(new CallRecord(sdf.parse(sub[4]+" "+sub[5]), sdf.parse(sub[6]+" "+sub[7]),sub[0]+" "+sub[1],sub[2]));

                   }

                }

            }

        }

       

       

        Collections.sort(Users);

        for(User e:Users) {

            System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));

        }

       

    }

 

}

手机用户的计费方式如下:

    class MovePhoneCharge extends ChargeMode{

    private double monthlyRent = 15;

   

    @Override

    public double calCost(UserRecord userRecords) {

        double cost1 = 0,cost2 = 0,cost3 = 0,cost4 = 0;

        double rate1 = 0,rate2 = 0,rate3 = 0;

       

        for(int i=0;i<userRecords.getCallInCity().size();i++) {

            if(userRecords.getCallInCity().get(i).getCallCode().split(" ")[1].matches("0791"))

                rate1 = 0.1;

            else if(userRecords.getCallInCity().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))

                rate1 = 0.3;

            else

                rate1 = 0.6;

           

            long time = userRecords.getCallInCity().get(i).getEnd().getTime()-userRecords.getCallInCity().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost1 += rate1*(time/(1000*60));

            else

                cost1 += rate1*(time/(1000*60)+1);

        }

        for(int i=0;i<userRecords.getCallInProvince().size();i++) {

            if(userRecords.getCallInProvince().get(i).getCallCode().split(" ")[1].matches("0791"))

                rate2 = 0.2;

            else if(userRecords.getCallInProvince().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))

                rate2 = 0.3;

            else

                rate2 = 0.6;

            long time = userRecords.getCallInProvince().get(i).getEnd().getTime()-userRecords.getCallInProvince().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost2 += rate2*(time/(1000*60));

            else

                cost2 += rate2*(time/(1000*60)+1);

        }

        for(int i=0;i<userRecords.getCallInLand().size();i++) {

            if(userRecords.getCallInLand().get(i).getCallCode().split(" ")[1].matches("0791"))

                rate3 = 0.3;

            else if(userRecords.getCallInLand().get(i).getCallCode().split(" ")[1].matches("(079\\d)|(0710)"))

                rate3 = 0.3;

            else

                rate3 = 0.6;

            long time = userRecords.getCallInLand().get(i).getEnd().getTime()-userRecords.getCallInLand().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost3 += rate3*(time/(1000*60));

            else

                cost3 += rate3*(time/(1000*60)+1);

        }

        for(int i=0;i<userRecords.getAnswerInLand().size();i++) {

            long time = userRecords.getAnswerInLand().get(i).getEnd().getTime()-userRecords.getAnswerInLand().get(i).getStart().getTime();

            if(time%(1000*60)==0)

                cost4 += 0.3*(time/(1000*60));

            else

                cost4 += 0.3*(time/(1000*60)+1);

        }

        return cost1+cost2+cost3+cost4;

    }

    @Override

    public double getMonthlyRent() {

        return monthlyRent;

    }

}

3.   题目集10

7-1 电信计费系列3-短信计费

本题只需要考虑开户信息和短信,在题目集09的基础上进行一些删改就可以完成了。可以说,这次题目集是这三次作业中最轻松的一次了,因为之前都把基础做好了。源码如下:

import java.util.Date;

import java.text.DecimalFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Scanner;

 

public class Main {

 

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

      Scanner in = new Scanner(System.in);

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

      DecimalFormat d = new DecimalFormat("0.0");

      ArrayList<User> Users = new ArrayList<>();

      String[] str = new String[100];

      String[] users = new String[100];

      String[] userRecords = new String[100];

      int c=0,k=0,m=0;

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

          str[i]=in.nextLine();

          c++;

          if(str[i].contains("end"))

              break;

      }

     

      for(int i=0;i<c-1;i++) {

          if(str[i].matches("u-1\\d{10} 3")) {

              boolean exist = false;

              for(int j=0;j<k;j++) {

                  if(users[j].equals(str[i]))

                      exist = true;

              }

              if(!exist) {

                  users[k] = str[i];

                  k++;

              }

          }else if(str[i].matches("m-1\\d{10} 1\\d{10} ([\\d]|[A-Z]|[a-z]| |\\.|\\,)*")) {

              userRecords[m] = str[i];

              m++;

          }

         

      }

     

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

            Users.add(new User(users[i]));

          for(int j=0;j<m;j++) {

              if(userRecords[j].substring(2,13).matches(Users.get(i).getNumber())) {

                  Users.get(i).userRecords.addSendMessage(new MessageRecord(userRecords[j].substring(26)));

              }

          }

      }

     

     

      Collections.sort(Users);

      for(User e:Users) {

          System.out.println(e.getNumber()+" "+d.format(e.calCost())+" "+d.format(e.calBalance()));

      }

     

   }

 

}

 

class User implements Comparable<User>{

   UserRecord userRecords = new UserRecord();

   private double balance = 100;

   private ChargeMode chargeMode;

   private String number;

  

   public User(String str) {

      this.number = str.substring(2,str.length()-2);

      if(str.charAt(str.length()-1) == '3')

          this.setChargeMode(new MovePhoneMessageCharge());

   }

  

   public double calBalance() {

      return balance-chargeMode.getMonthlyRent()-calCost();

   }

   public double calCost() {

      return chargeMode.calCost(userRecords);

     

   }

   public UserRecord getUserRecords() {

      return userRecords;

   }

   public void setUserRecords(UserRecord ur) {

      userRecords = ur;

   }

   public double getBalance() {

      return balance;

   }

   public ChargeMode getChargeMode() {

      return chargeMode;

   }

   public void setChargeMode(ChargeMode cm) {

      chargeMode = cm;

   }

   public String getNumber() {

      return number;

   }

   public void setNumber(String n) {

      number = n;

   }

 

   @Override

   public int compareTo(User o) {

      return this.getNumber().compareTo(o.getNumber());

   }

}

 

class UserRecord{

   private ArrayList<CallRecord> callInCity = new ArrayList<CallRecord>();

   private ArrayList<CallRecord> callInProvince = new ArrayList<CallRecord>();

   private ArrayList<CallRecord> callInLand = new ArrayList<CallRecord>();

   private ArrayList<CallRecord> answerInCity = new ArrayList<CallRecord>();

  private ArrayList<CallRecord> answerInProvince = new ArrayList<CallRecord>();

   private ArrayList<CallRecord> answerInLand = new ArrayList<CallRecord>();

   private ArrayList<MessageRecord> sendMessage = new ArrayList<MessageRecord>();

   private ArrayList<MessageRecord> receiveMessage = new ArrayList<MessageRecord>();

  

   public void addCallInCity(CallRecord cr) {

      callInCity.add(cr);

   }

   public void addCallInProvince(CallRecord cr) {

      callInProvince.add(cr);

   }

   public void addCallInLand(CallRecord cr) {

      callInLand.add(cr);

   }

   public void addAnswerInCity(CallRecord cr) {

      answerInCity.add(cr);

   }

   public void addAnswerInProvince(CallRecord cr) {

      answerInProvince.add(cr);

   }

   public void addAnswerInLand(CallRecord cr) {

      answerInLand.add(cr);

   }

   public void addSendMessage(MessageRecord mr) {

      sendMessage.add(mr);

   }

   public void addReceiveMessage(MessageRecord mr) {

      receiveMessage.add(mr);

   }

   public ArrayList<CallRecord> getCallInCity() {

      return callInCity;

   }

   public ArrayList<CallRecord> getCallInProvince() {

      return callInProvince;

   }

   public ArrayList<CallRecord> getCallInLand() {

      return callInLand;

   }

   public ArrayList<CallRecord> getAnswerInCity() {

      return answerInCity;

   }

   public ArrayList<CallRecord> getAnswerInProvince() {

      return answerInProvince;

   }

   public ArrayList<CallRecord> getAnswerInLand() {

      return answerInLand;

   }

   public ArrayList<MessageRecord> getSendMessage() {

      return sendMessage;

   }

   public ArrayList<MessageRecord> getReceiveMessage() {

      return receiveMessage;

   }

}

 

abstract class ChargeMode{

   private ArrayList<ChargeRule> chargeRules = new ArrayList<>();

  

   public ArrayList<ChargeRule> getChargeRules(){

      return chargeRules;

   }

   public void setChargeRules(ArrayList<ChargeRule> cr) {

      chargeRules = cr;

   }

   public double calCost(UserRecord ur) {

      return 0;

   }

   public double getMonthlyRent() {

      return 20;

   }

}

 

 

class MovePhoneMessageCharge extends ChargeMode{

   private double monthlyRent = 0;

  

   public double calCost(UserRecord userRecords) {

      double cost = 0;

      int ml = 0;

        double cal = 0;

      for(int i=0;i<userRecords.getSendMessage().size();i++) {

          cal = userRecords.getSendMessage().get(i).getMessage().length()/10.0;

            if(cal%1!=0)

                cal = cal+1.0;

          ml += (int)cal;

      }

      if(ml<=3)

          cost = 0.1*ml;

      else if(ml<=5)

          cost = 0.3+0.2*(ml-3);

      else if(ml>5)

          cost = 0.7+0.3*(ml-5);

      return cost;

   }

   @Override

   public double getMonthlyRent() {

      return monthlyRent;

   }

}

 

abstract class ChargeRule{

  

}

 

abstract class CallChangeRule extends ChargeRule{

   public double calCost(ArrayList<CallRecord> cr) {

      return 0;

   }

}

 

class CityRule extends CallChangeRule{

   @Override

   public double calCost(ArrayList<CallRecord> cr) {

      // TODO Auto-generated method stub

      return super.calCost(cr);

   }

}

 

class ProvinceRule extends CallChangeRule{

   @Override

   public double calCost(ArrayList<CallRecord> cr) {

      // TODO Auto-generated method stub

      return super.calCost(cr);

   }

}

 

class LandRule extends CallChangeRule{

   @Override

   public double calCost(ArrayList<CallRecord> cr) {

      // TODO Auto-generated method stub

      return super.calCost(cr);

   }

}

 

abstract class CommunicationRecord{

   String callNumber;

   String answerNumber;

  

   public String getCallNumber() {

      return callNumber;

   }

   public void setCallNumber(String cn) {

      callNumber = cn;

   }

   public String getAnswerNumber() {

      return answerNumber;

   }

   public void setAnswerNumber(String an) {

      answerNumber = an;

   }

}

 

class CallRecord extends CommunicationRecord{

   private Date start;

   private Date end;

   private String callCode;

   private String answerCode;

  

   public CallRecord(Date start,Date end ,String callCode, String answerCode) {

      this.start = start;

      this.end = end;

      this.callCode = callCode;

      this.answerCode = answerCode;

   }

  

   public Date getStart() {

      return start;

   }

   public void setStart(Date start) {

      this.start = start;

   }

   public Date getEnd() {

      return end;

   }

   public void setEnd(Date end) {

      this.end = end;

   }

   public String getCallCode() {

      return callCode;

   }

   public void setCallCode(String callCode) {

      this.callCode = callCode;

   }

   public String getAnswerCode() {

      return answerCode;

   }

   public void setAnswerCode(String answerCode) {

      this.answerCode = answerCode;

   }

  

}

 

class MessageRecord extends CommunicationRecord{

   private String message;

 

   public MessageRecord(String m) {

      message = m;

   }

  

   public String getMessage() {

      return message;

   }

 

}

三、  采坑心得

在完成这3次题目集的过程中,我遇到了一些的问题,下面将对我遇到一些的问题分享一下我的心得:

首先,日期的转化问题。将字符串按格式转化为日期时,需要在转化发生的函数后面

加上throws ParseException,也就是需要抛出异常;其次,用户排序的问题。一开始我使用的是for循环来进行排序,测试用例的输出结果是正确的,但是一直过不了测试点。在和室友的排序方法进行对比后,我发现了问题所在,于是采用了Collections.sort(Users)这种方式来进行排序,顺利地通过了全部测试点。

四、  改进建议

前面说道,我判断通讯记录的正则表达式十分繁琐,这是一个急需改进的地方。SimpleDateFormat类可以对日期进行格式化,可是我对此并没有很了解,应用起来十分困难,希望之后可以熟练应用。

五、  总结

在完成这三次题目集的过程中,我遇到了很多困难,也收获了很多知识点。尽管我总是被难题虐到心累,我还是愿意继续不断的尝试,直到正确。之后,我需要学习和改进的地方还有很多,但是我会尽量使自己变得更优秀。靠自己的努力得到的满分,才是满满的成就感!

 

posted @ 2022-06-16 23:53  此时·此刻  阅读(28)  评论(0)    收藏  举报