假定分水口门的数据上报时是采用人工输入的方式,每一行代表一个整点时刻的分水数据,各数据之间采用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。抄袭后果自负