BLOG-3
BLOG-3|PTA作业|学习通
17207119胡立鑫
7-1 电信计费系列2-手机+座机计费
实现南昌市电信分公司的计费程序,假设该公司针对手机和座机用户分别采取了两种计费方案,分别如下:
1、针对市内座机用户采用的计费方式(与电信计费系列1内容相同):
月租20元,接电话免费,市内拨打电话0.1元/分钟,省内长途0.3元/分钟,国内长途拨打0.6元/分钟。不足一分钟按一分钟计。
假设本市的区号:0791,江西省内各地市区号包括:0790~0799以及0701。
2、针对手机用户采用实时计费方式:
月租15元,市内省内接电话均免费,市内拨打市内电话0.1元/分钟,市内拨打省内电话0.2元/分钟,市内拨打省外电话0.3元/分钟,省内漫游打电话0.3元/分钟,省外漫游接听0.3元/分钟,省外漫游拨打0.6元/分钟;
注:被叫电话属于市内、省内还是国内由被叫电话的接听地点区号决定,比如以下案例中,南昌市手机用户13307912264在区号为020的广州接听了电话,主叫号码应被计算为拨打了一个省外长途,同时,手机用户13307912264也要被计算省外接听漫游费:
u-13307912264 1
t-079186330022 13307912264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
输入
输入信息包括两种类型
1、逐行输入南昌市用户开户的信息,每行一个用户,含手机和座机用户
格式:u-号码 计费类型 (计费类型包括:0-座机 1-手机实时计费 2-手机A套餐)
例如:u-079186300001 0
座机号码由区号和电话号码拼接而成,电话号码包含7-8位数字,区号最高位是0。
手机号码由11位数字构成,最高位是1。
本题在电信计费系列1基础上增加类型1-手机实时计费。
手机设置0或者座机设置成1,此种错误可不做判断。
2、逐行输入本月某些用户的通讯信息,通讯信息格式:
座机呼叫座机:t-主叫号码 接听号码 起始时间 结束时间
t-079186330022 058686330022 2022.1.3 10:00:25 2022.1.3 10:05:11
以上四项内容之间以一个英文空格分隔,
时间必须符合"yyyy.MM.dd HH:mm:ss"格式。提示:使用SimpleDateFormat类。
输入格式增加手机接打电话以及收发短信的格式,手机接打电话的信息除了号码之外需要额外记录拨打/接听的地点的区号,比如:
座机打手机:
t-主叫号码 接听号码 接听地点区号 起始时间 结束时间
t-079186330022 13305862264 020 2022.1.3 10:00:25 2022.1.3 10:05:11
手机互打:
t-主叫号码 拨号地点 接听号码 接听地点区号 起始时间 结束时间
t-18907910010 0791 13305862264 0371 2022.1.3 10:00:25 2022.1.3 10:05:11
注意:以上两类信息,先输入所有开户信息,再输入所有通讯信息,最后一行以“end”结束。
输出
根据输入的详细通讯信息,计算所有已开户的用户的当月费用(精确到小数点后2位,单位元)。假设每个用户初始余额是100元。
每条通讯、短信信息均单独计费后累加,不是将所有信息累计后统一计费。
格式:号码+英文空格符+总的话费+英文空格符+余额
每个用户一行,用户之间按号码字符从小到大排序。
错误处理
输入数据中出现的不符合格式要求的行一律忽略。
import java.util.Comparator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Objects;
import java.util.Scanner;
import java.util.Date;
public class Main {
static String []tel = {"0792","0793","0794","0795","0796","0797","0798","0799","0701"};
public static void main(String[] args) throws ParseException {
Scanner input = new Scanner(System.in);
String ch = new String();
ch = input.nextLine();
ArrayList<User>users = new ArrayList<>();
SimpleDateFormat date=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
// System.out.printf(ch);
while (!ch.equals("end")) {
// System.out.printf(ch+"\n");
try {
if ((ch.matches("^u-[0-9]{11,12} [0-1]$") || ch.matches("(^t-[0]{1}[0-9]{9,11} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$)|(^t-1[0-9]{10} 0[0-9]{2,3} ((0[0-9]{9,11})|(1[0-9]{10} 0[0-9]{2,3})) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$)"))) {
String[] splitSet = ch.split("-");
//String[] splitset2 = splitSet[1].split(" ");
if (splitSet[0].equals("u")) {
String[] splitSet2 = splitSet[1].split(" ");
if(!numEqual(users,splitSet2[0])){
try {
users.add(newUesr(splitSet2[0],splitSet2[1]));
} catch (Exception a){
}
}
} else {
users = newRecord(users, splitSet[1]);
}
}
}catch (Exception e){
}
ch = input.nextLine();
}
Collections.sort(users, new Cmp());
for(User U:users){
try {
System.out.println(U.getNumber()+" "+printDouble(U.calCost())+" "+printDouble(U.calBalance()));
}
catch (Exception ps){
}
}
}
static User newUesr(String ch,String ch2){
User user = new User(ch);
if(Objects.equals(ch2, "0"))
user.chargeMode = new LandlinePhoneCharging();
else if(Objects.equals(ch2, "1"))
user.chargeMode = new MobilePhoneCharging();
return user;
}
public static double printDouble(double num) {
String str = String.format("%.3f",num);
num = Double.parseDouble(str);
return num;
}
static boolean numEqual(ArrayList<User> User,String num){
for(User user:User){
if(user.getNumber().equals(num))
return true;
}
return false;
}
static ArrayList<User> newRecord(ArrayList<User> user,String ch) throws ParseException {
String[] splitSet = ch.split(" ");
if(splitSet.length==6) {
CallRecord callRecord = new CallRecord(splitSet[2], splitSet[3], splitSet[4], splitSet[5], splitSet[0].substring(0, 4), splitSet[1].substring(0, 4));
for (User U : user) {
if (U.number.equals(splitSet[0])) {
if (callRecord.callingAddressAreaCode.equals("0791")) {
U.getUserRecords().addCallingInCityRecords(callRecord);
return user;
}
for (String tel2 : tel) {
if (callRecord.answerAddressAreaCode.equals(tel2)) {
U.getUserRecords().addCallingInProvinceRecords(callRecord);
return user;
}
}
U.getUserRecords().addCallingInLandRecords(callRecord);
return user;
}
}
}
else if(splitSet.length==7){
if(splitSet[1].length()>splitSet[2].length()){
CallRecord callRecord = new CallRecord(splitSet[3], splitSet[4], splitSet[5], splitSet[6], splitSet[0].substring(0, 4), splitSet[2]);
int cNum = judgePlace(splitSet[0].substring(0, 4)),aNum = judgePlace(splitSet[2]);
for (User U : user) {
if (U.number.equals(splitSet[0])) {
if(aNum==1){
U.getUserRecords().addCallingInCityRecords(callRecord);
}
if(aNum==2){
U.getUserRecords().addCallingInProvinceRecords(callRecord);
}
if(aNum==0){
U.getUserRecords().addCallingInLandRecords(callRecord);
for (User U2 : user)
if (U2.number.equals(splitSet[1])){
U2.getUserRecords().addAnswerRoamInLandRecords(callRecord);
return user;
}
}
return user;
}
}
}
else{
CallRecord callRecord = new CallRecord(splitSet[3], splitSet[4], splitSet[5], splitSet[6], splitSet[1], splitSet[2].substring(0, 4));
int cNum = judgePlace(splitSet[1]),aNum = judgePlace(splitSet[2].substring(0, 4));
for (User U : user) {
if (U.number.equals(splitSet[0])) {
if(cNum == 0){
U.getUserRecords().addCallingRoamInLandRecords(callRecord);
}
if(cNum == 1){
if(aNum ==0){
U.getUserRecords().addCallingInLandRecords(callRecord);
}
else if(aNum ==1){
U.getUserRecords().addCallingInCityRecords(callRecord);
}
else {
U.getUserRecords().addCallingInProvinceRecords(callRecord);
}
}
if(cNum == 2){
U.getUserRecords().addCallingRoamInProvinceRecords(callRecord);
}
}
}
}
}
else if(splitSet.length==8){
CallRecord callRecord = new CallRecord(splitSet[4], splitSet[5], splitSet[6], splitSet[7], splitSet[1], splitSet[3]);
int cNum = judgePlace(splitSet[1]),aNum = judgePlace(splitSet[3]);
for (User U : user) {
if (U.number.equals(splitSet[0])) {
if(cNum == 0){
U.getUserRecords().addCallingRoamInLandRecords(callRecord);
}