当为“指定最长时间”执行do while循环时,它给出了一个有效输入,它在断开循环之前仍会给出错误消息。
Scanner console = new Scanner(System.in);
System.out.println("Specify city : ");
String city;
//loops if input is anything but New York or Paris
do {
city = console.next();
if (!city.equals("New York") && !city.equals("Paris")) {
System.out.println("Enter valid city");
}
} while (!city.equals("New York") && !city.equals("Paris"));
System.out.println("Specify Max Time (HH:MM) : ");
String time;
//loops if input not is in 24 hour format
do {
time = console.next();
if (!time.matches("[0-9]{2}:[0-9]{2}")); {
System.out.println("Enter Valid Time (HH:MM) :");
}
} while (!time.matches("[0-9]{2}:[0-9]{2}"));
答案 0 :(得分:3)
你的正则表达时间不好。一个问题是let curDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let comps: NSDateComponents = calendar.components([NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Year], fromDate: curDate)
comps.day = 1 //first moment of the month
let firstDateMonth = calendar.dateFromComponents(comps)
comps.month = comps.month+1 //first moment of next month
let lastDateMonth = calendar.dateFromComponents(comps)
let totalInterval = lastDateMonth?.timeIntervalSinceDate(firstDateMonth!)
let intervalToEnd = lastDateMonth?.timeIntervalSinceNow
let percentLeft = intervalToEnd!/totalInterval!
print(percentLeft)
应该是"[0-9]"
,另一个是你的代码是复杂的 - 使用一个正则表达式测试整个表达式:
"[0-9]{2}"
您还有另一个错误:
在第一个if (!time.matches("\\d\\d:\\d\\d"))
子句中,您正在测试while
而不是"paris"
。
答案 1 :(得分:0)
您可以大大简化模式匹配:
do {
// Your stuff goes here
} while(!time.matches("[0-9]{2}:[0-9]{2}"));
// --------------------^^^^^^^^^^^^^^^^^
// Easier, don't you think?
此外,您还需要检查小时和分钟的值是否有效:小时的值应介于0和23之间,分钟的值应介于0和59之间。
您已经有足够的时间来检查和验证您的代码。在这里,我将自己的,经过测试的解决方案放在你的问题上,因为我感觉很慷慨,而且我现在没有更好的事情可以做了:
import java.util.Scanner;
public class SO_Example_20151205_01 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
String pattern = "[0-9]{2}:[0-9]{2}"; // The pattern you'll use to validate if the time is valid
String time; // The input variable
boolean valid_time = false; // A flag to break the loop. Initialized to false
int hour, minute;
// I prefer to use a 'while' loop in this case.
// The loop will break if the valid_time variable is true
while(!valid_time) {
System.out.print("Enter time (HH:MM):\t");
time = console.next();
// Check if the input matches the pattern:
if(time.matches(pattern)) {
// Now, check if the input values are valid
hour = Integer.parseInt(time.substring(0,2));
minute = Integer.parseInt(time.substring(3,5));
if(hour >= 0 && hour <= 24 && minute >= 0 && minute < 60) {
valid_time = true;
} else {
System.out.println("\nYou've entered a valid pattern, but the values are invalid!\n Please try again");
}
} else {
System.out.println("\nYou entered a non recognized pattern. Please try again\n");
}
}
System.out.println("Done!");
}
}
请注意,使用while
循环,您可以避免多次编写内容。另外,检查我使用的模式......它有效!
我经常使用布尔标志来破坏我的循环(也许它不是更清洁的解决方案,但它可以工作,它可以让你准确地看到循环即将中断的位置和时间)。此外,我还在输入中添加了小时和分钟的验证。
这个解决方案故意冗长......这正是我想要的:这样,你就可以更容易地看到发生了什么。
答案 2 :(得分:0)
你的程序中有很多错误...... 1)当您将城市作为输入时,将destination_input更改为城市。
if (!city.equals("New York") && !city.equals("Paris")) {
2)在do while循环中将其更改为Paris
} while (!city.equals("New York") && !city.equals("Paris"));
3)将time_input更改为time,因为您输入的时间不是time_input(变量未在任何地方声明)
4)更改正则表达式以检查时间,因为正则表达式只检查单个数字,但它将是两位数
time.substring(0, 2).matches("[0-9]{2}")
time.substring(3, 5).matches("[0-9]{2}")
更好的解决方案是使用单个正则表达式
if (!time.matches("\\d\\d:\\d\\d"))
5)将time.substring(4).matches替换为time.charAt(2)==':'。time.substring(4)将返回开始索引4之后的所有字符。
同时退出条件也进行类似的更改