如何从一行字符串为多个变量赋值。例如。
String time = sc.next(); // the amount of time to delay from shutdown
String timeframe = sc.next(); // time frame : seconds, minutes, ect
如果这是关闭代码,并且用户输入“10分钟”,我如何将变量10分配给整数(当然在我解析之后),并使用时间范围(以及一些数学) )创建关机延迟。
对于程序的这一部分,最终目标是让用户能够输入一个干净的命令“关闭10分钟”,并让Windows在10分钟后安排关闭。
目前,用户必须这样做:“关闭”[ENTER]“10”[ENTER]“分钟”[ENTER]。
程序的其余部分没问题,只是这给我带来了不规则的问题。
完整的课程代码:
public void Start() {
Scanner sc = new Scanner(System.in);
int xtime = 0;
boolean goodTime = false, goodTimeFrame = false;
String time = sc.next();
String timeframe = sc.next();
try {
xtime = Integer.parseInt(time);
if(xtime<0) { System.out.println("time cannot be less than 0..."); }
else if(xtime>=0) { goodTime = true; }
} catch(Exception e){ System.out.println("invalid input..."); }
try {
switch(timeframe.toLowerCase()) {
case "secs":
xtime = xtime*1000;
goodTimeFrame = true;
break;
case "mins":
xtime = xtime*60000;
goodTimeFrame = true;
break;
case "hrs":
xtime = xtime*3600000;
goodTimeFrame = true;
break;
default:
System.out.println("invalid timeframe, use: secs, mins, or hrs...");
break;
}
} catch(Exception e){ System.out.println("cannot convert to valid time..."); }
if(goodTime && goodTimeFrame) {
try {
Runtime.getRuntime().exec("Elevate.exe shutdown -s -t "+xtime);
} catch(Exception e){ System.out.println("error ordering shutdown command..."); }
}
else { System.out.println("syntex example : shutdown time timeframe"
+ "\nshutdown 10 mins"); }
}
答案 0 :(得分:2)
实际上这应该按你编写的方式工作。
当用户输入shutdown 10 mins[ENTER]
时,您将sc.next()
调用3次,其值为“shutdown”,“10”和“mins”。
更新:在您的情况下,由于不必要的复杂性,您不应该更改两次。只需使用'\ n'作为分隔符扫描整行,并将值参数传递给第二种方法:
Scanner sc = new Scanner(System.in).useDelimiter("\n");
String wholeCommand=sc.next(); // will read "shutdown 10 mins" as one line
String[] values = wholeCommand.split(" ");
// check of array length here
if ("shutdown".equals(values[0])) {
start(value[1], values[2]);
}
答案 1 :(得分:2)
在Java中工作时,Javadoc是您的第一个参考。 String
有许多用于提取包含数据的方法。 String.split()是你的朋友:
String line = "shutdown 10 mins";
String[] split = line.split("\\s+"); // Split the String on one or more spaces
String cmd = split[0];
String time = split[1];
String timeframe = split[2];
答案 2 :(得分:0)
这是我提出的更好的解决方案。
String input = sc.nextLine();
String[] temp = input.split(" ");
LinkedList<String> command = new LinkedList<String>(Arrays.asList(temp));
if(command.get(0).equalsIgnoreCase("shutdown") && command.size()==3) {
Shutdown shutdown = new Shutdown();
shutdown.Start(command);
}
现在在Shutdown.class ...
内public void Start(LinkedList<String> command) {
int xtime = 0;
boolean goodTime = false, goodTimeFrame = false;
String time = command.get(1);
String timeframe = command.get(2);
try {
xtime = Integer.parseInt(time);
if(xtime<0) { System.out.println("time cannot be less than 0..."); }
else if(xtime>=0) { goodTime = true; }
} catch(Exception e){ System.out.println("invalid input..."); }
try {
switch(timeframe.toLowerCase()) {
case "secs":
goodTimeFrame = true;
break;
case "mins":
xtime = xtime*60;
goodTimeFrame = true;
break;
case "hrs":
xtime = xtime*3600;
goodTimeFrame = true;
break;
default:
System.out.println("invalid timeframe, use: secs, mins, or hrs...");
break;
}
} catch(Exception e){ System.out.println("cannot convert to valid time..."); }
if(goodTime && goodTimeFrame) {
try {
Runtime.getRuntime().exec("cmd /c shutdown -s -t "+xtime);
} catch(Exception e){ System.out.println("error ordering shutdown command..."); }
}
else { System.out.println("syntex example : shutdown time timeframe"
+ "\nshutdown 10 mins"); }
}
所以我们基本上创建了一个数组,然后将其转换为LinkedList。从那里我们将变量传递给shutdown类,后者按预期使用它。用户只需输入“shutdown 10 min”行,就会启动命令。