在一个字符串中分配多个变量 - Java

时间:2014-02-04 19:06:28

标签: java java.util.scanner

如何从一行字符串为多个变量赋值。例如。

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"); }
    }

3 个答案:

答案 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”行,就会启动命令。