java第四次作业,pta第一题。记录一下代码,实在不知道哪里出了问题。

假定分水口门的数据上报时是采用人工输入的方式,每一行代表一个整点时刻的分水数据,各数据之间采用Tab(“\t”)进行分隔,每次可以输入多条数据,直到遇到用户输入“exit”为止,每一行输入数据共包含五部分:测量时间、目标水位、实际水位、开度(包含目标开度和实际开度,以“/”分隔)、流量。 各数据格式要求如下:

测量时间:格式为“年/月/日 时:分”,其中年份取值范围为[1,9999],“月”与“日”为一位数时之前不加“0”,日期与时间之间有一个空格,“时”与“分”之间采用冒号分隔(英文半角),“时”为一位数时之前不加“0”,“分”始终保持两位,“秒”始终为“00”。注意:“时”数必须是24小时进制中的偶数值。
目标水位、实际水位、流量:均为实型数,取值范围为[1,1000), 小数点后保留1-3位小数或无小数(也无小数点)
目标开度、实际开度:实型数,取值范围为[1,10),必须保留2位小数,两个开度之间用“/”分隔


import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; 
public class Main {
	public static void main(String[] args) { 
		Scanner input = new Scanner(System.in);  
		//String s = input.nextLine();		//带空格的字符串
		//HydrologicalInfo [] hydrologicalInfo = new HydrologicalInfo[100] ;
		String str="";	//带空格的字符串
		StringBuilder ss=new StringBuilder();
		while((str=input.nextLine())!=null){
			if(str.equals("exit")){
			break;
			}
			ss.append(str);
			ss.append('\n');
		}
		String data123 = ss.toString();
		//data123.trim();
		if(data123.matches("^\\s*|\\s*$")) {			//判断连续输入为空
			//System.out.println("Wrong Format");
			//System.out.println("Data:");
			System.out.println("Max Actual Water Level:0.00");		//判断连续输入为空
			System.out.println("Total Water Flow:0.00");
			System.exit(1);
		}
		//System.out.println(data123);
		//System.out.println(data123.length());
		/*if(data123==null) {
			System.out.println("Wrong Format");
			System.exit(1);
		}*/
		DealData data = new DealData(ss);
		data.getDealDateResult();
		//data.computDate();
		//System.out.println(data.getSb());
		/*for(String a:s5){
			System.out.println(a);
		}*/
}
}
class  DealData {
	private StringBuilder sb;  
	HydrologicalInfo [] hydrologicalInfo = new HydrologicalInfo[1000] ;
	DealData(){
		
	}
	DealData(StringBuilder sb){
	this.sb=sb;	
	}
	public StringBuilder getSb() {
		return this.sb;
	}
	public void setSb(StringBuilder sb) {
		this.sb=sb;	
	}
	public void getDealDateResult() {
		String data = sb.toString();
		//data.trim();//除去tab
		String[] a = data.split("\n");
		boolean flag=true;
		for(int i=0;i < a.length; i++){
			a[i]=a[i].trim();
			CheckData checkData = new CheckData(a[i],i+1);
			if(checkData.validataData())	//校验
			{
				hydrologicalInfo[i]=checkData.tohydrologicalInfo();
			}
			else
				flag=false;
			//System.out.println(a[i]);
		}
		if(flag) {
			computDate();
		}
		else
			System.exit(1);

		
	}
	public void computDate() {
		int i=0;
		int row=1;
		double sum=0;
		double max = hydrologicalInfo[0].getActualWaterLevel();
		while(hydrologicalInfo[i]!=null) {
			if(max<hydrologicalInfo[i].getActualWaterLevel()) {
				max=hydrologicalInfo[i].getActualWaterLevel();
			}
			if(hydrologicalInfo[i].getActualGateOping()>hydrologicalInfo[i].getObjectGateOping()) {
				System.out.println("Row:"+row+" GateOpening Warning");
			}
			sum = sum+hydrologicalInfo[i].getWaterflow()*2*60*60;
			i++;
			row++;
		}
		System.out.println("Max Actual Water Level:"+String.format("%.2f",max));
		System.out.println("Total Water Flow:"+String.format("%.2f",sum));
	}
}
class  CheckData {//数据校验类
	private String data;
	private int row;
	CheckData()
	{
		
	}
	CheckData(String data,int row)
	{
		this.data=data;
		this.row=row;
	}
	public void setData(String data,int row)
	{
		this.data=data;
		this.row=row;
	}
	public String[] getData()
	{
		String[] a = data.split("\t");
		for(int i=0;i<a.length;i++) {
			a[i]=a[i].trim();
		}
		a[3]=a[3].replaceAll(" ", "");
		/*if(a.length!=5) {
			System.out.println("Wrong Format");
			
		}*/
		/*for(String b:a){
			System.out.println(b);
		}*/
		return a;
		
	}
	public int getRow() {
		return this.row;
	}
	public boolean validataData() {		//数据合法性校验
		String[] b=getData();
		if(b.length!=5) {
		System.out.println("Wrong Format");
		System.out.println(this.data);
		return false;
		}
		if(validataMeasureDataTime(b[0])&&validataWaterLevel(b[1])&&validataWaterLevel(b[2])&&validataGateOping(b[3])&&validataWaterLevel(b[4])){
			return true;
		}
		else {
				if (!validataMeasureDataTime(b[0])){
					System.out.println("Row:"+this.row+",Column:"+1+"Wrong Format");
					//System.out.println(b[0]);
					//return false;
				}
				if(!validataWaterLevel(b[1])){
					System.out.println("Row:"+this.row+",Column:"+2+"Wrong Format");
					//System.out.println(b[1]);
					//return false;
				}
				
				if(!validataWaterLevel(b[2])){
					System.out.println("Row:"+this.row+",Column:"+3+"Wrong Format");
					//System.out.println(b[2]);
					//return false;
				}
				if(!validataGateOping(b[3])){
					String[] c = b[3].split("/");
					//c[0]=c[0].replaceAll(" ", "");
					//c[1]=c[1].replaceAll(" ", "");
					//if(!c[0].matches("^[0-9]{1}+(.[0-9]{2})?$"))	//if(c[0].matches("^[0-9]{1}+(.[0-9]{2})?$"))少加了!
					//[1-9]\\.\\d{0,2}
					if(!c[0].matches("[1-9]\\.\\d{2}"))
					System.out.println("Row:"+this.row+",Column:"+4+"Wrong Format");
					//if(!c[1].matches("^[0-9]{1}+(.[0-9]{2})?$"))	//if(c[1].matches("^[0-9]{1}+(.[0-9]{2})?$"))少加了!无法判断000.00情况
					if(!c[1].matches("[1-9]\\.\\d{2}"))
					System.out.println("Row:"+this.row+",Column:"+5+"Wrong Format");
					
					//System.out.println(b[3]);
					//System.out.println(c[0]);
					//System.out.println(c[1]);
					//return false;
				}
				if(!validataWaterLevel(b[4])){
					//String[] c = b[4].split("/");
					//if(c[0].matches("^[0-9]{1,3}+(.[0-9]{1,3})?|[0-9]{1,3}?$"))
					System.out.println("Row:"+this.row+",Column:"+6+"Wrong Format");
					//else
					//System.out.println("Row:"+this.row+",Column:"+6+"Wrong Format");
					//System.out.println(b[4]);
					//return false;
				}
		System.out.println("Data:"+this.data);
		return false;
		}
	}
    public boolean validataMeasureDataTime(String measuredatetime) {
 		 Pattern p = Pattern.compile("((([1-9]{1}|[1-9][0-9]{1}|[1-9][0-9]{2}|[1-9][0-9]{3})/((([13578]|1[02])/([1-9]|[12][0-9]|3[01]))|(([469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8]))))|((([1-9]{0,1}[0-9]{0,1})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))/2/29)) ([02468]|1[02468]|2[02]):00");
 		return p.matcher(measuredatetime).matches();
 	}
	/*public boolean validataMeasureDataTime(String measureDateTime) {	//采集时间合法性校验
		String [] b= measureDateTime.split(" ");
		//System.out.println(b[0]);
		//System.out.println(b[1]);
		//if(b[0].matches("^\\d{4}/\\d{1,2}/\\d{1,2}")&&b[1].matches("(0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]"))
		
		if(b[0].matches("^\\d{1,4}/((1|3|5|7|8|10|12)/([1-9]|[1-2]\\d|3[0-1])|(4|6|9|11)/([1-9]|[1-2]\\d|30)|2/([1-9]|[1-2]\\d))$")&&b[1].matches("([0-9]|1[0-9]|2[0-3]):00")){
			String[] c = b[1].split(":");
			int a=	Integer.valueOf(c[0]);
			//System.out.println(a);
			if(a%2==0)
				return true;
			else
			return false;//判断年月日以及时间
		}
		else 
			return false;
        //return measureDateTime.matches("^\\d{4}/\\d{1,2}/\\d{1,2}");
	}*/
	public boolean validataWaterLevel(String waterLevel) {	//水位合法性校验
		//return waterLevel.matches("^[0-9]{1,3}+(.[0-9]{1,3})?|[0-9]{1,3}?$");
		return waterLevel.matches("[1-9]\\d{0,2}(\\.\\d{1,3})?");
		
	}
	public boolean validataGateOping(String gateOping) {	//开度合法性校验
		//return gateOping.matches("^[0-9]{1}+(.[0-9]{2})?/[0-9]{1}+(.[0-9]{2})?$");
		return gateOping.matches("[1-9]\\.\\d{2}/[1-9]\\.\\d{2}");
		
	}
	public HydrologicalInfo tohydrologicalInfo(){
		String[] d=getData();
		String [] time= d[0].split(" ");
		String [] time1=time[0].split("/");
		int year =Integer.valueOf(time1[0]);
		int month =Integer.valueOf(time1[1]);
		int day =Integer.valueOf(time1[2]);
		LocalDateTime localDateTime = new LocalDateTime(year,month,day);
		double objectWaterLevel =  Double.parseDouble(d[1]);
		double actualWaterLevel = Double.parseDouble(d[2]);
		String [] GateOping= d[3].split("/");
		double objectGateOping = Double.parseDouble(GateOping[0]);
		double actualGateOping = Double.parseDouble(GateOping[1]);
		double waterflow = Double.parseDouble(d[4]);
		HydrologicalInfo hydrologicalInfo = new HydrologicalInfo(localDateTime,objectWaterLevel,actualWaterLevel,objectGateOping,actualGateOping,waterflow);
		return hydrologicalInfo;
	}
}
class HydrologicalInfo {	//实体、水文信息类
	private LocalDateTime measureDateTime;//测量时间
	private double objectWaterLevel;//目标水位
	private double actualWaterLevel;//实际水位
	private double objectGateOping;//阀门开度
	private double actualGateOping;//实际开度
	private double waterflow;//流速
	HydrologicalInfo(){
	
		
	}
	HydrologicalInfo(LocalDateTime measureDateTime,double objectWaterLevel,double actualWaterLevel,double objectGateOping,double actualGateOping,double waterflow){
		this.measureDateTime=measureDateTime;
		this.objectWaterLevel=objectWaterLevel;
		this.actualWaterLevel=actualWaterLevel;
		this.objectGateOping=objectGateOping;
		this.actualGateOping=actualGateOping;
		this.waterflow=waterflow;
	}
	public void setMeasureDateTime(LocalDateTime measureDateTime){
		 this.measureDateTime=measureDateTime;
	}
	public LocalDateTime getMeasureDateTime(){
		return this.measureDateTime;
	}
	
	public void setObjectWaterLevel(double objectWaterLevel) {//目标水位
		this.objectWaterLevel=objectWaterLevel;
	}
	public double getObjectWaterLevel() {//目标水位
		return this.objectWaterLevel;
	}
	
	public void setActualWaterLevel(double actualWaterLevel) {//实际水位
		this.actualWaterLevel=actualWaterLevel;
	}
	public double getActualWaterLevel() {//实际水位
		return this.actualWaterLevel;
	}
	
	public void setObjectGateOping(double objectGateOping) {//阀门开度
		this.objectGateOping=objectGateOping;
	}
	public double getObjectGateOping() {//阀门开度
		return this.objectGateOping;
	}
	
	public void setActualGateOping(double actualGateOping) {//实际开度
		this.actualGateOping=actualGateOping;
	}
	public double getActualGateOping() {//实际开度
		return this.actualGateOping;
	}
	
	public void setwaterflow(double waterflow) {//流速
		this.waterflow=waterflow;
	}
	public double getWaterflow() {//流速
		return this.waterflow;
	}
}
class  LocalDateTime{//测量时间属性类
	
	private int year;
	private int month;
	private int day;
	LocalDateTime(){
		
	}
	LocalDateTime (int year, int month,int day){
		this.year=year;
		this.month=month;
		this.day=day;
	}
	
}

```可参考借鉴,杜绝抄袭。作者:nchuhwc。抄袭后果自负


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值